我有一个代码的三个版本,我不想要逻辑明智,但为什么语法明智。
module top_module(
input clk,
input areset, // async active-high reset to zero
input load,
input ena,
input [3:0] data,
output reg [3:0] q);
always@(posedge clk or posedge areset)
begin
if(areset)
q<=0;
if(load | ena)
begin
q[3]<=(0 & (~load) & ena) | (load & data[3]) ;
q[2]<=(q[3]& (~load) & ena) | (load & data[2]) ;
q[1]<=(q[2]& (~load) & ena) | (load & data[1]) ;
q[0]<=(q[1]& (~load) & ena) | (load & data[0]) ;
end
else
q<=q;
end
endmodule
上面的代码导致了错误。
module top_module(
input clk,
input areset, // async active-high reset to zero
input load,
input ena,
input [3:0] data,
output reg [3:0] q);
always@(posedge clk)
begin
if(areset)
q<=0;
if(load | ena)
begin
q[3]<=(0 & (~load) & ena) | (load & data[3]) ;
q[2]<=(q[3]& (~load) & ena) | (load & data[2]) ;
q[1]<=(q[2]& (~load) & ena) | (load & data[1]) ;
q[0]<=(q[1]& (~load) & ena) | (load & data[0]) ;
end
else
q<=q;
end
endmodule
上面这个不会导致错误。
module top_module(
input clk,
input areset, // async active-high reset to zero
input load,
input ena,
input [3:0] data,
output reg [3:0] q);
always@(posedge clk or posedge areset)
begin
if(areset)
q<=0;
else if(load | ena)
begin
q[3]<=(0 & (~load) & ena) | (load & data[3]) ;
q[2]<=(q[3]& (~load) & ena) | (load & data[2]) ;
q[1]<=(q[2]& (~load) & ena) | (load & data[1]) ;
q[0]<=(q[1]& (~load) & ena) | (load & data[0]) ;
end
else
q<=q;
end
endmodule
这个也不会导致错误。
从 Verilog 语言的角度来看,第一个代码示例中不存在语法错误。
但是,从综合的角度来看,存在错误。 综合的要求是您的代码必须匹配特定模式,以便综合工具可以将行为代码映射到支持的逻辑门。以下模式与您的综合工具映射到的任何内容都不匹配:
always@(posedge clk or posedge areset)
begin
if(areset)
q<=0;
if(load | ena)
支持第二个代码示例,因为您从敏感度列表中删除了
posedge areset
:
always@(posedge clk)
还支持第三个代码示例,因为您将
if
更改为 else if
:
else if(load | ena)
请参阅可合成的构造进行讨论。 您的综合工具文档还应该讨论支持的语法。