1

我被这个愚蠢的想法困住了:在一个verilog测试平台中,我想让不同的信号做一个简单的模式:

_ -------- _ _

因为有很多信号我想像这样切换,所以我创建了一个任务:

//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

4

2 回答 2

2

Verilog 中任务和函数的参数通过值和类型参数传递,并且outputinout任务或函数返回时更新。

所以你的例子中发生的事情是这样的:

  1. rst_chip_n初始化为 X
  2. reset_phase调用时传入rst_chip_n(X)的值
  3. reset_phase任务的生命周期内,signal更新。这只是任务内部的。如果您的波形查看器允许您signal在任务中查看,您应该能够观察到这一点。
  4. 完成reset_phase后, 的值signal将被复制回rst_chip_n

如果您允许模拟运行超过时间 300,您将在时间 300 看到go to 0,因为这是您任务中rst_chp_n的最终值。signal

我认为您无法通过简单的任务来完成这种类型的模式生成。一种选择是制作一个小模块来驱动模式并将输出连接到您想要控制的信号。

于 2012-12-14T16:47:23.097 回答
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
于 2012-12-15T00:07:18.450 回答