【问题标题】:Getting an error calling a task in verilog testbench在 Verilog 测试台中调用任务时出错
【发布时间】:2021-09-23 02:25:18
【问题描述】:

我在我的 Verilog 测试平台中使用不同的输入向量执行任务(为了简单起见,我没有写这部分)

task input_set_1;
    begin
    end
endtask

task input_set_2;
    begin
    end
endtask

task input_set_3;
    begin
    end
endtask

task input_set_4;
    begin
    end
endtask

我正在尝试使用以下任务在测试台模拟期间仅调用其中一个

task input_calling;
    integer i;
    begin
        i = $urandom_range(1, 4);
        input_set_i;
    end
endtask

initial begin
    #3;
    input_calling;
end

我期望每次测试运行时,input_set_1input_set_2input_set_3input_set_4 中的任何一个都将根据随机数 i=1 到 4 被调用,但是,我我收到一条错误消息,提示 input_set_i 未定义。我怀疑某些字符串与 int 不匹配阻止我在输入 _set_i 任务中采用随机值。

【问题讨论】:

  • 什么功能让您认为最后一个i 应该被替换?为什么不是第一个i

标签: verilog test-bench


【解决方案1】:

您正在尝试做一些在 verilog(以及任何非脚本语言)中不可能的事情。任务名称是编译器必须在编译时知道的编译时元素。 i 是一个运行时的动态元素。您不能使用运行时对象来修改编译时对象。

因此,您最好的选择是使用动态语言功能来使您的程序正常工作,例如if 语句。这是一个例子:

module top;
  task a;
    $display("a");
  endtask
  task b;
    $display("b");
  endtask

  initial begin
    for (int k = 0; k < 4; k++) begin
      automatic int i = $urandom_range(2,1);
      if (i == 1)
        a;
      else if (i == 2)
        b;
    end
  end
endmodule

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多