如何为任务提供输入

时间:2019-07-26 07:53:45

标签: verilog system-verilog

我已经在测试台中创建了一个任务,该任务需要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传递变量作为任务输入是否有问题?如果是,函数也一样吗? 有人可以帮我吗?谢谢!

2 个答案:

答案 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,并增加时间延迟。