Verilog:if 语句和 case 语句之间的区别

时间:2021-07-10 07:12:03

标签: verilog hdl

我是 Verilog 语言的新手,想做一些练习来熟悉它。我在 HDLbits 上遇到了这个问题:DFF8ar

这个问题要求我创建具有高电平有效异步复位的 8 个 D 触发器。我使用 case 语句来处理 areset 信号:

module top_module (
input clk,
input areset,   // active high asynchronous reset
input [7:0] d,
output reg[7:0] q
);

always @(posedge clk or posedge areset) begin
    case (areset)
        1'b1: q <= 8'b0; 
        default: q <= d;
    endcase
end
endmodule

令我惊讶的是,它生成的电路忽略了 clk 信号: enter image description here

但是,如果我将 case 语句切换为 if-else 语句,结果将是正确的:

always @(posedge clk or posedge areset) begin
    if (areset)
        q <= 8'b0; 
    else q <= d;
end

enter image description here

即使做了一些研究,我也不知道背后的原因。 if-else 语句和 case 语句有一些根本区别吗?任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:3)

Synthesis 对普通 Verilog 语言设置了一些特殊限制。 综合工具识别特定的 Verilog 编码模式,但您的 case 代码不匹配任何这些模式,而您的 if/else 代码匹配。您的工具集应该有文档说明综合支持哪些语法。运行综合时,可能有警告或错误消息;检查任何日志文件。

尽管 2 种编码风格在模拟中的表现可能相同,但您需要将自己限制在支持的综合语法上。