Verilog:if语句和case语句的区别
Verilog: differences between if statement and case statement
我是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
信号:
但是,如果我将 case
语句切换为 if-else
语句,结果将是正确的:
always @(posedge clk or posedge areset) begin
if (areset)
q <= 8'b0;
else q <= d;
end
即使做了一些研究,我也不知道背后的原因。 if-else
语句和 case
语句有一些根本区别吗?感谢您的帮助!
Synthesis 对普通的 Verilog 语言有一些特殊的限制。
综合工具识别特定的 Verilog 编码模式,但您的 case
代码不匹配任何这些模式,而您的 if/else
代码匹配。您的工具集应该有文档,显示综合支持的语法。当你运行合成时,可能会出现警告或错误信息;检查任何日志文件。
虽然这 2 种编码风格在模拟中可能表现相同,但您需要限制自己使用支持的综合语法。
我是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
信号:
但是,如果我将 case
语句切换为 if-else
语句,结果将是正确的:
always @(posedge clk or posedge areset) begin
if (areset)
q <= 8'b0;
else q <= d;
end
即使做了一些研究,我也不知道背后的原因。 if-else
语句和 case
语句有一些根本区别吗?感谢您的帮助!
Synthesis 对普通的 Verilog 语言有一些特殊的限制。
综合工具识别特定的 Verilog 编码模式,但您的 case
代码不匹配任何这些模式,而您的 if/else
代码匹配。您的工具集应该有文档,显示综合支持的语法。当你运行合成时,可能会出现警告或错误信息;检查任何日志文件。
虽然这 2 种编码风格在模拟中可能表现相同,但您需要限制自己使用支持的综合语法。