在Verilog选择分支语句中有三种基本结构,分别是:if语句,case语句以及问号?语句。
- 前两种只能用在顺序过程语句中;而?语句可以在并发赋值表达式中使用,也可以在顺序语句中使用
- ?语句在顺序语句中只能对reg型变量(寄存器)赋值
- ?语句在并发语句中只能对wire型变量赋值
因此,虽然if语句,case语句和问号?语句都是分支选择语句,但是它们的用法还是有很大的差别的。
1.问号语句的特点:
- 用于判断的表达式可以是关系表达式,等式表达式,逻辑表达式,wire型变量,reg型变量等。
- 在并发语句中,只能对wire型变量赋值,
- 在always引导的顺序过程中使用,只能对reg型变量赋值
例1:
module selx
(
input sel,
input [3:0] a, b,
output [3:0] c
);
assign c = sel ? a : b;
endmodule
在例1中问号表达式在并发赋值语句中使用。而例2问号表达式在顺序过程的赋值语句中使用。
例2:
module selx
(
input sel,
input [3:0] a, b,
output [3:0] c
);
reg [3:0] tmp;
assign c = tmp;
always@(sel, a, b)
tmp = sel ? a : b;
endmodule
- 问号语句可以嵌套,即在一个问号语句的分支中可以嵌套另一个问号分支语句。
例3:
module selx
(
input [1:0] sel,
input [3:0] a, b, c,
output [3:0] y
);
assign y = (sel==2’b00) ? a :(sel==2’b01) ? b : c; //在分支嵌套问号?语句。
endmodule
- 问号表达式是惟一的三元表达式。
如:c = sel ? a : b;
2. 三种分支选择语句的比较:
| 并发语句 | 顺序语句 | 优先级 | 判断条件传递x | 可嵌套 | 可综合 | |
| if else | 否 | 是 | 有 | 否 | 是 | 是 |
| case | 否 | 是 | 没有 | 否 | 是 | 是 |
| ? | 是 | 是 | 有 | 是 | 是 | 是 |
对应视频: