Verilog 设计问题
Verilog Design Problems
如何修复代码中的多驱动程序、默认值和组合循环问题下面?
always @(posedge clk)
myregister <= #1 myregisterNxt;
always @* begin
if(reset)
myregisterNxt = myregisterNxt +1;
else if(flag == 1)
myregister = myregister +2;
end
对了,你的代码中至少有 3 个问题:
您正在 myregister
行驶在 2 个不同的 always 街区内。综合将在那里找到多个驱动程序。模拟结果将不可预测。规则:您必须在单个 always 块内驱动信号。
您在 myregisterNxt = myregisterNxt +1
上进行了零延迟循环。由于您在那里使用的是 no-flop,因此它是模拟和硬件中的真实循环。你需要用 flops
打破这样的循环
#1
延迟是不可综合的,这里根本不需要。
您没有描述您试图构建的内容,并且很难从我们的代码示例中弄清楚。一般情况下,reset
用于设置初始值。所以,像下面这样的东西可以作为你的模板。
always @(posedge clk) begin
if (reset)
myregister <= 0;
else
myregister <= myregister + increment;
end
always @* begin
if (flag == 1)
increment = 1;
else
increment = 2;
end
带有 posedge clk 和非阻塞分配的 flop 不会在循环中。
如何修复代码中的多驱动程序、默认值和组合循环问题下面?
always @(posedge clk)
myregister <= #1 myregisterNxt;
always @* begin
if(reset)
myregisterNxt = myregisterNxt +1;
else if(flag == 1)
myregister = myregister +2;
end
对了,你的代码中至少有 3 个问题:
您正在
myregister
行驶在 2 个不同的 always 街区内。综合将在那里找到多个驱动程序。模拟结果将不可预测。规则:您必须在单个 always 块内驱动信号。您在
myregisterNxt = myregisterNxt +1
上进行了零延迟循环。由于您在那里使用的是 no-flop,因此它是模拟和硬件中的真实循环。你需要用 flops 打破这样的循环
#1
延迟是不可综合的,这里根本不需要。
您没有描述您试图构建的内容,并且很难从我们的代码示例中弄清楚。一般情况下,reset
用于设置初始值。所以,像下面这样的东西可以作为你的模板。
always @(posedge clk) begin
if (reset)
myregister <= 0;
else
myregister <= myregister + increment;
end
always @* begin
if (flag == 1)
increment = 1;
else
increment = 2;
end
带有 posedge clk 和非阻塞分配的 flop 不会在循环中。