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

Verilog同一always块多次赋值优先级及综合逻辑疑问

Verilog赋值优先级与综合问题

已知示例

已知如下Verilog代码中,由于enable2所在的if语句顺序靠后,赋值优先级更高,a最终会被赋值为1:

reg a;

always @(posedge clk) begin

    if (enable1) begin
      a <= 0;
    end
    if (enable2) begin
      a <= 1;
    end
end

问题

现询问如下代码中,a是否仍为1?是否需要经过更多逻辑门?还是代码赋值优先级始终生效,由综合工具处理逻辑?

reg a;
reg state<=0;

always @(posedge clk) begin
    
    a=0;

    case(state) 
    0: begin
    if (enable) begin
      a=1; end
    end
end

解答

  • a的取值情况:当state为0且enable有效时,a最终是1;如果state不为0,或者state为0但enable无效,a就会是初始赋值的0。这里和第一个例子逻辑一致——顺序块里后面的赋值会覆盖前面的,只要case和if的条件满足,就会把a从0改成1。
  • 逻辑门数量:不会额外增加逻辑门。综合工具会自动简化这段代码的逻辑,比如等价转换成a <= (state == 0 && enable) ? 1'b1 : 1'b0;这样的条件赋值,生成的硬件逻辑和直接写这个表达式的情况差不多,不会有多余的逻辑门。
  • 赋值优先级与综合工具的作用:Verilog顺序块里“后赋值覆盖前赋值”的规则是明确的,综合工具会完全按照这个语义生成硬件,不需要开发者操心逻辑门的细节,只要代码逻辑正确,工具会自动处理硬件实现的优化。

内容的提问来源于stack exchange,提问作者Ilan Mermelstein

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 22:22:34