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
相关产品推荐
相关产品推荐

