使用verilog任务创建模式

时间:2012-12-14 16:25:01

标签: design-patterns task verilog

我被这个愚蠢的想法困住了: 在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

2 个答案:

答案 0 :(得分: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
  5. 如果您允许模拟在时间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