使用 Icarus Verilog 模拟程序计数器设计时的无限循环
Posted
技术标签:
【中文标题】使用 Icarus Verilog 模拟程序计数器设计时的无限循环【英文标题】:Infinite loop when simulating a Program Counter design with Icarus Verilog 【发布时间】:2014-04-06 22:10:06 【问题描述】:我正在使用以下原型实现一个简单的程序计数器加法器:
module program_counter(input enable_count,
input enable_overwrite,
input[31:0] overwrite_value,
output[31:0] out);
当使用 Icarus Verilog 进行模拟时,我在第一个滴答声中得到一个无限循环,在该循环上禁用覆盖并启用计数,因此内部寄存器由 PC 加法器 (PC + 4) 的输出提供。
我将问题简化为一段基本代码,其中 D 触发器用作 1 位寄存器:
module register(input in, input set, output out);
wire not_in;
wire q0;
wire not_q0;
wire not_q;
nand (q0, in, set);
not (not_in, in);
nand (not_q0, not_in, set);
nand (out, q0, not_q);
nand (not_q, not_q0, out);
endmodule
module test;
reg clock;
reg in;
wire out;
wire not_out;
xor (x_out, out, 1); // add
or (muxed_out, x_out, in); // mux
register r(muxed_out, clock, out);
initial
begin
$dumpfile("test.vcd");
$dumpvars(0, test);
$display("\tclock,\tin,\tout");
$monitor("\t%b,\t%x,\t%b",
clock, in, out);
#0 assign in = 1; // erase register
#0 assign clock = 1;
#1 assign in = 0;
#1 assign clock = 0;
#2 assign clock = 1;
#3 assign clock = 0;
#4 assign clock = 1;
end
endmodule
模拟卡住后,VCD 输出没有显示任何状态变化。
我的猜测是,在特定的滴答声中,加法器不断地输入不同的值(不断地加法),因此它不稳定,模拟器正在等待修复该值并卡住。
这个设计是否正确(即可以合成并且应该可以工作)?
【问题讨论】:
尝试删除代码中的所有assign
关键字。
注意!我已尝试删除它们,但无法解决问题。
【参考方案1】:
有一个组合循环:“寄存器”的输出通过测试中的异或/或门反馈到其输入。您实际上已经创建了一个ring oscillator。
如果您在寄存器中添加以下代码,您可以看到这种情况:
always @(in) $display("@%d: in = %d", $time, in);
当你运行解释器时你会看到一堆这样的:
@ 1: in = 1
@ 1: in = 0
@ 1: in = 1
@ 1: in = 0
您似乎正在尝试在“寄存器”中启用锁存器。那是你的意图吗?边沿触发触发器是同步设计中的常规做法。您需要两个背靠背的闩锁才能做到这一点,但在 Verilog 中执行此操作的标准(也更容易)方法是这样的:
reg my_flop;
always @(posedge clk)
my_flop <= input;
如果你真的想要一个闩锁,可以这样推断(但这些往往容易出错并且通常不鼓励):
always @(clk, input)
begin
if (clk)
my_flop = input;
end
您尝试使用门手动创建这些是有原因的吗?
【讨论】:
谢谢!事实上,我完全错过了这样一个事实,即我这里没有边沿触发的数据触发器,而是一个无限写入自身的简单数据锁存器。至于为什么我想用门手动创建它,我觉得最好通过更接近裸晶体管来学习,并且基本上编写模拟器将从 RTL 描述中生成的内容。不知道有没有道理。 我明白了。请注意,RTL 模拟器通常会将 flop 建模为一个单元,而不是将其进一步分解(即使您为 ASIC 合成 Verilog,它也会将 flop 映射到单个单元 en.wikipedia.org/wiki/Standard_cell)以上是关于使用 Icarus Verilog 模拟程序计数器设计时的无限循环的主要内容,如果未能解决你的问题,请参考以下文章
使用自由软件Icarus Verilog Simulator进行仿真