改进的if…else判断语句
SystemVerilog的判断修饰符unique和priority可以和if…else一起使用。使用这些修饰符不仅可以减少此类判断语句的不确定性,还可以在建模早期发现潜在的设计错误。
1、unique if…else判断语句
unique if…else可以并行求值
修饰符unique表示条件排列的顺序并不重要。软件工具会将推断出的判断顺序优先级优化掉。
logic[2:0] sel;
always_comb
beginunique if(sel==3'b001) mux_out = a;else if(sel==3'b010) mux_out = b;else if(sel==3'b100) mux_out =c;
end
unique条件检查
unique if…else不能包含重叠的条件
软件工具会对unique if判断语句进行检查,以确保在一连串if…else…if的所有判定条件都是互斥的。这允许判断语句并行执行,而不需要优先级编码。若软件工具发现有多条判定条件为真,则产生运行期警告。这样的警告信息可以在编译或运行期出现。这种附加的检查会帮组工程人员在模块验证的早期发现建模的错误。
防止无意产生锁存逻辑
unique if…else对未指明状态进行警告
当if语句指定了unique修饰后,如果软件工具发现if语句执行时没有一条分支语句执行,就会报告一条运行期警告。
这种运行期的语法检查确保了在执行过程中实际出现的所有判定条件都全部指明了。当判断序列执行时,总会有一个分支执行。这样也保证了用纯粹的组合逻辑实现,而不需要锁存器。
2、priority if判断语句
priority if…else必须按顺序进行求值
修饰符priority表示分支的次序是重要的。软件工具必须按照原有次序进行计算。
always_comb
beginpriority if(irq0) irq=4'b0001;else if(irq1) irq=4'b0010;else if(irq2) irq=4'b0100;else if(irq3) irq=4'b1000;
end
因为模块本身已经显式地说明了上面的判断序列必须按照次序进行求值,因此所有的软件工具都会保持推断出的优先级编码。
防止无意中产生锁存逻辑
priority if…else必须指定所有条件
和使用unique修饰一样,当if语句中指定了priority修饰符后,软件工具会在运行期检查if…else…if序列每次都会执行一个分支。