条件运算符的真假
在进行Verilog进行编码的时候经常要用到三目的条件运算符,但是经常会有初学者,甚至一些经验丰富的工程师在对条件运算符中的条件表达式进行编写时采用了标识符本身作为判断,导致输出结果与期望不一致。本文将通过示例一种典型的条件运算符使用错误的问题。
【问题要求】
当信号enable为0时,条件为真,将信号sig1输出;
当信号enable为1时,条件为假,将信号sig2输出;
【示例代码】
【仿真结果】
可能有些人满脑子的“纳尼”,怎么跟期望的结果不一致呢?为什么enable为0时输出的不是sig1呢?其实仿真的结果是正确的。示例中,enable为0时,条件运算符会对仅由enable组成的条件判断表达式进行判断,但是此时enable的值为0,所以仅由enable组成的这个单标识符的条件判断表达式的值为0,即假,所以选择执行了将sig2传输给dout。为了实现问题的要求,那么需要对enable的值通过关系运算符“==”与0进行比较,通过比较得到的布尔值选择条件执行分支,为此我们对上例代码进行修改。
【示例代码】
【仿真结果】
通过对条件运算符的条件判断表达式“enable == 1’b0”的值进行判断选择期望的分支。其实在Verilog中布尔值的定义,零值为“假”,任何非零值都是“真”,并不是规定只有1才能为真。第一个示例中,因为使用enable本身作为判断条件,当enable本身为0值时,条件判断为假,所以选择了第二个条件分支。但是在第二个示例中,将“enable == 1’b0”比较的结果作为条件判断,当enable为0值时,“enable == 1’b0”表达式返回“真”,所以选择了第一个分支。出现上述问题的根本原因是因为大家混淆了变量本身值和条件判断表达式结果的值,从而导致出现的问题与期望不一致。