程序中存在错误,我确定它始终由negedge iChang
引起。错误是:
节点中的零时振荡.......检查组合环路的设计或矢量源文件。
我的部分节目如下:
input clk, rst,iChang;
always@(posedge clk or negedge rst or negedge iChang)
begin
if(!iChang)//auto mode,serious problems!!!!!!!!!!!!!!!!!!
begin
if(!rst)
begin
s1<=state1;
A<=3'b0;
B<=3'b0;
count1<=3'd4;
count2<=3'd2;
count3<=3'd3;
count4<=3'd2;
temp<=1'b1;
end
else
begin
if(temp==1)
begin
temp<=1'b0;
case(s1)
state1:
begin
times<=count1;
A<=3'b001;
B<=3'b100;
s1<=state2;
end
state2:
begin
times<=count2;
A<=3'b010;
B<=3'b100;
s1<=state3;
end
state3:
begin
times<=count3;
A<=3'b100;
B<=3'b001;
s1<=state4;
end
state4:
begin
times<=count4;
A<=3'b100;
B<=3'b010;
s1<=state1;
end
default:
begin
A<=3'b000;
B<=3'b000;
end
endcase
end
如果我删除negedge iChang
块和always
块中的if(!iChang)
,则不会出现错误。我不理解negedge iChang
和组合循环之间的关系。似乎没有反馈可以导致组合循环。
答案 0 :(得分:2)
边沿触发的始终块用于同步逻辑。它应该有一个时钟参考,它可能有一个异步复位,可能有一个异步设置。根据您的代码,iChang
上的posedge clk
似乎应该在@*
上进行采样,因此它不应该在敏感列表中。我相信你将同步始终块的灵敏度列表要求与IEEE1364-1995组合总是块的混淆。 IEEE1364-1995型组合总是块要求所有输入信号都列在灵敏度列表中。 (推荐使用IEEE1364-2001的自动敏感列表(@(*)
/ always @(posedge clk or negedge rst) begin
if(!rst) begin
// ... reset code ...
end
else if (!iChang) begin
// ... synchronous code ...
end
end
)用于组合总是阻止)
假设您想要异步重置,那么您的always块应如下所示:
iChang
如果你真的希望always @(posedge clk) begin
if (!iChang) begin
if(!rst) begin
// ... reset code ...
end
else begin
// ... synchronous code ...
end
end
end
阻止重置,那么也要使重置同步:
{{1}}