You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:01:01