关于Vivado中priority if语句综合原理图的疑问
SystemVerilog优先级if综合原理图疑问解答
问题描述
我正在学习SystemVerilog,编写了带priority if的代码,在Vivado中综合后的原理图无法理解:
module ifelseDUT( input logic sela, selb, selc, da,db,dc, output logic dout ); always @* begin dout = 0; priority if(sela) dout = da; if(selb) dout = db; if(selc) dout = dc; end endmodule
综合原理图显示sela未被使用,且多路选择器上标注“S=default”,无法理解其含义。Vivado综合无错误或警告,仅提示:
[Synth 8-293] found qualifier priority on case statement: implementing as full_case ["C:/Users/homealien/Xilinx/ifelse-test/ifelse-test.srcs/sources_1/new/ifelseDUT.sv":32]
问题解答
1. 原理图中sela未直接显示的原因
你的代码里,priority if仅修饰第一个if,但后续两个if是独立的顺序执行语句,而非else if分支。实际逻辑执行顺序是:
- 先将
dout初始化为0 - 若
sela=1,dout被赋值为da - 无论sela是什么值,都会继续判断
selb:若selb=1,dout会被覆盖为db - 同理,无论selb是什么值,继续判断
selc:若selc=1,dout会被覆盖为dc
也就是说,只有当selb=0且selc=0时,sela的取值才会影响dout(此时dout为da或0)。综合器做了逻辑优化,把这部分逻辑合并到了多路选择器的默认分支中,所以原理图里没有单独显示sela的输入。
2. 多路选择器“S=default”的含义
这个默认分支对应selb和selc都为0的场景,此时输出逻辑是sela ? da : 0——综合器把这部分逻辑打包成了默认选项,而非单独做一个选择器输入端口。
3. Vivado提示信息翻译
[Synth 8-293] 发现case语句上的priority限定符:将按full_case实现 ["C:/Users/homealien/Xilinx/ifelse-test/ifelse-test.srcs/sources_1/new/ifelseDUT.sv":32]
综合器将你写的priority if结构转换为case语句处理,并且按照full_case(所有输入组合都被覆盖,无未定义情况)的规则实现。
正确的优先级选择写法
如果你想实现sela优先级最高,其次selb,最后selc的逻辑,应该使用priority if-else if链,代码如下:
module ifelseDUT( input logic sela, selb, selc, da,db,dc, output logic dout ); always @* begin priority if(sela) dout = da; else if(selb) dout = db; else if(selc) dout = dc; else dout = 0; end endmodule
这样综合后的原理图会清晰体现三个选择信号的优先级逻辑,sela会作为最高优先级的选择信号直接显示。
内容的提问来源于stack exchange,提问作者tulamba
相关产品推荐
相关产品推荐

