我已经在测试台中创建了一个任务,该任务需要3个输入,但是似乎其中一个的值是错误的。
下面是我的代码。我已经知道s
具有与dut.r.f
相同的值,但是当我运行模拟时,并不是这样。
主要:
module main(
input logic clk,
input logic vaux2_p,
input logic vaux2_n,
output logic gpio1,
);
logic [8:0] f;
inst r(
.clk (clk),
.f (f),
);
endmodule
R:
module inst(
input logic clk,
output logic [ 8:0] f
);
always_ff @(posedge clk) begin
f <= 8'h0_F0;
end
endmodule
TESTBENCH:
module m();
logic clk;
logic vaux2_p;
logic vaux2_n;
logic gpio1;
main dut(
.clk(clk),
.vaux12_p (vaux2_p),
.vaux12_n (vaux2_n),
.gpio1 (gpio1)
);
task test;
input [ 7:0] a;
input [8:0] v;
input [8:0] s;
integer f1;
begin
f1 = $fopen("file.txt","w");
if (!f1) begin
$display("File \"file.txt\" cannot be opened!");
end else begin
//this part of code is just for test what I'm reading
$fdisplay(f1," f: %0h %0b %0d", dut.r.f,dut.r.f,dut.r.f);
$fdisplay(f1,"s: %0h %0b %0d", s,s,s);
$fdisplay(f1,"v: %0h %0b %0d", v,v,v);
$fclose(f1);
end
endtask
initial begin
test(8'h19,24'hFF00, dut.r.f);
$finish;
end
endmodule
如果我运行此代码,然后打开file.txt,我能读到的是这样的:
f: f0 11110000 240
s: xxxxxx xxxxxxxxxxxxxxxxxxxxxxxx x
v: f0 11110000 240
我当时想这可能是由于这样的事实,在模拟dut.r.f=xxxxxx
的开始并且只有ns
之后才出现f0
,但后来我意识到不能因为两个原因而成为问题:第一个原因是,如果信号的值是在模拟开始时获取的,则f
也应等于xxxxxx
,第二个原因是即使如果在显示信号值之前引入延迟,则问题仍然存在。
您是否知道从main传递变量作为任务输入是否有问题?如果是,函数也一样吗?
有人可以帮我吗?谢谢!
答案 0 :(得分:0)
这里的问题是仅当输入task test
时,任务输入参数才通过值传递。实际参数的进一步更新不会通过。您需要使用引用传递来查看以后的更新。将任务声明更改为
task test(
input logic [ 7:0] a,
input logic [8:0] v,
ref logic [8:0] s);
int f1;
有关更多详细信息,请参见this post。
答案 1 :(得分:0)
假设您提供的测试平台完整,那么根本的问题是dut.r.f
所依赖的时钟永远不会触发。
initial begin
clk = 1'b0; // init clock;
#1; // time to propagate
clk = 1'b1; // will trigger @(posedge clk) if connected properly
#1; // time to propagate
test(8'h19,24'hFF00, dut.r.f);
$finish;
end
如果要在切换时钟之前开始任务,则需要使用SystemVerilog的ref
而不是dave_59的答案中提到的input
,并增加时间延迟。