Verilog中两条相等判断assign语句的硬件行为差异咨询
Verilog两条赋值语句差异说明
首先给出示例代码:
reg [31:0] A; wire B; // 语句1 assign B = (A == 32'h0) ? (1'b1) : (1'b0); // 语句2 assign B = (A == 32'h0);
二者的差异可以从三个层面区分:
1 常规功能仿真等价
正常场景下(A的所有位都是确定的0或1),两条语句的输出完全一致:
A == 32'h0是等值比较运算,返回1位布尔值,匹配时输出1'b1,不匹配输出1'b0- 语句1的三元运算符只是把比较结果的真假和1、0做了显式映射,和比较运算本身的返回值完全对应,所以常规功能仿真下没有任何区别。
2 特殊状态下的行为差异
当A的任意位出现不定态X或者高阻态Z时,等值比较的结果为1'bX,此时两条语句的处理逻辑遵循Verilog标准的不同规则:
- 语句2直接将比较结果赋值给B,B会直接得到
1'bX,不定态无损耗向后级电路传播 - 语句1的三元运算符在条件为X/Z时,会对两个分支的返回值做按位判断:两个分支对应位相同则返回该值,对应位不同则返回X。此处两个分支分别为
1'b1和1'b0,标准规定下输出也是1'bX,但部分老旧仿真工具对三元运算符的X态处理存在自定义实现,可能出现和语句2不一致的仿真结果。
3 硬件实现的差异
- 语句2会被所有主流综合工具直接推断为32位等值比较器的输出直接连线到B,没有额外的逻辑开销,时序最优
- 部分低版本综合工具、或者设置了特殊综合约束时,语句1的三元运算符会被推断为额外的2选1多路选择器:两个输入分别接固定电平1和0,选择端接比较器输出。虽然逻辑功能等价,但会引入额外的门级面积开销,门级仿真下也会出现比语句2更大的传输延迟。
另外从代码可读性角度,语句2的写法更简洁直接,语句1属于冗余写法,会增加后续代码维护的理解成本。
内容的提问来源于stack exchange,提问作者Rsvay
相关产品推荐
相关产品推荐

