提问:verilog 在进行数值比较(使用 ==,===,>=, <= 等比较运算符)时,如果有一个或两个运算符是未知的(比如 x 或 z),会有怎样的行为?
详细解释:
我正在做HDLbits的这道题目(题目链接:https://hdlbits.01xz.net/wiki/Rotate100 ) 。
这道题目的大意是设计一个 rotate register,当信号 ena 为 2'b01 时,寄存器往右边rotate,当ena为 2'b10 时,寄存器往左边rotate。
当 ena 为 2'b00 和 2'b11 时,参考另一个信号 load,若此时 load = 1, 则把 输入data的值放进寄存器里。
以下是我的代码:(贴图)
然而,根据波形图,当 “ena 为未知值” 且 “load = 1”时,data的值并没有被装载到q上。我认为,原因是当 ena 为未知值时,比较运算符会有一些特殊的行为。
为了解决我的问题,我付出了如下努力:
1. 我检查了 Quartus 综合信息 和 ModelSim 模拟信息,没有给出任何 warning
2. STFW。Google 搜索“verilog unknown value comparison”。总结一下搜集到的信息主要是:
2.1. == 运算符 和 === 运算符有差异。当运算数存在 x 和 z 时,== 运算符的结果只能是 x(除x和z意外,其它位都相等) 或者 0(除x和z以外,有其它位不相等)。
而 === 运算符会把 x 和 z 当成普通的位进行比较。举个例子:2'b01 == 2'b0x 的结果是x,而 2'b01 === 2'b0x 的结果则是 0。
看完这则信息,我把我的代码中的 == 都改成了 ===,但模拟结果并没有变化。
2.2.
3. 我把代码改成了这个样子:(aaaa, bbbb, cccc, dddd), 想查看仿真时,电路到底选择了哪个分支,波形图如下(波形图)
可以看到 output q 的值是XXXXXXXX,我认为原因是代码中的 if 和 else if 中的表达式结果是“未知的”,
因此在仿真时,电路并不知道自己应该选择哪个分支,所以q的值就是“未知的”
如此看来,想要让我的结果跟 Ref 的模拟结果一样,只需要把 load 的优先级提高到比ena更高就行了。
但是,相比如此,我更希望我能实现一个这样的电路:当 ena 是 01 或者 10 时,忽略 load,而当 ena 为其它值或者未知时,
标签:load,ena,rotate,HDLbits,运算符,波形图,未知,100 From: https://www.cnblogs.com/yinhuachen/p/16659496.html