在Verilog选择分支语句中有三种基本结构,分别是:if语句,case语句以及问号?语句。
- 前两种只能用在顺序过程语句中;而?语句可以在并发赋值表达式中使用,也可以在顺序语句中使用
- ?语句在顺序语句中只能对reg型变量(寄存器)赋值
- ?语句在并发语句中只能对wire型变量赋值
因此,虽然if语句,case语句和问号?语句都是分支选择语句,但是它们的用法还是有很大的差别的。
1.问号语句的特点:
- 用于判断的表达式可以是关系表达式,等式表达式,逻辑表达式,wire型变量,reg型变量等。
- 在并发语句中,只能对wire型变量赋值,
- 在always引导的顺序过程中使用,只能对reg型变量赋值
例1:
|
1 2 3 4 5 6 7 8 9 10 11 |
module selx ( input sel, input [3:0] a, b, output [3:0] c ); assign c = sel ? a : b; endmodule |
在例1中问号表达式在并发赋值语句中使用。而例2问号表达式在顺序过程的赋值语句中使用。
例2:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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:
|
1 2 3 4 5 6 7 8 9 10 |
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 | 否 | 是 | 没有 | 否 | 是 | 是 |
| ? | 是 | 是 | 有 | 是 | 是 | 是 |
对应视频: