我被这个愚蠢的想法困住了: 在verilog testbench中,我想让不同的信号做一个简单的模式:
的 的 _ --------的 _ _ < / p>
因为我想要切换很多信号,所以我创建了一个任务:
//timescale 10ns / 100ps//
module tb;
reg rst_chip_n;
task reset_phase;
inout signal;
begin
signal = 1'b0;
#(100);
signal = 1'b1;
#(100);
signal = 1'b0;
#(100);
end
endtask
initial begin
reset_phase(rst_chip_n);
$finish;
end
endmodule
但是,这不起作用,模拟时间为300,但rst_chip_n的值始终未定义。 为什么?我怎么能创建一个任务,在我想要的任何信号上做一个类似的模式? 谢谢大家!
˚F
答案 0 :(得分:2)
Verilog中任务和函数的参数按值传递,类型output
和inout
的参数仅在任务或函数返回时更新。
所以你的例子中发生了什么:
rst_chip_n
初始化为X reset_phase
时,传递rst_chip_n
(X)的值reset_phase
任务的生命周期内,signal
会更新。这只是任务的内部。如果波形查看器允许您在任务中看到signal
,您应该能够观察到这一点。reset_phase
完成后,signal
的值将被复制回rst_chip_n
如果您允许模拟在时间300之后运行,您会在时间300看到rst_chp_n
转到0,因为这是您任务中signal
的最终值。
我认为你不能用简单的任务来完成这种类型的模式生成。一种选择是制作一个小模块来驱动模式并将输出连接到您想要控制的信号。
答案 1 :(得分:0)
无需将参数传递给任务。由于您在模块范围内声明了任务,因此它将看到这些变量并在调用它时随时使用它们。
module tb;
reg rst_chip_n;
task reset_phase;
begin
rst_chip_n = 1'b0;
#(100);
rst_chip_n = 1'b1;
#(100);
rst_chip_n = 1'b0;
#(100);
end
endtask
initial begin
reset_phase;
$finish;
end
endmodule