Verilog:具有为局部变量连续分配输出的任务

时间:2018-12-10 23:43:20

标签: task verilog

我正在寻找一条语句(例如任务/功能),它具有在任务结束时连续分配(局部变量的)输出而不是一次的能力。    例如:

import System.IO

main = do
  hSetNewlineMode stdin universalNewlineMode
  interact $ unlines . filter ((<10) . length) . lines

我得到的值是最后一个值,然后 out_from_task1 的值是12。我需要查看信号 out_from_task1 发生变化。前10个,过一会儿12个。

我可以在不使用Verilog的全局变量的情况下执行此操作吗? 这一切都是从在测试台中并行执行更多任务开始的。

3 个答案:

答案 0 :(得分:1)

不,您不能在verilog中执行此操作。在分配输出参数之前,“任务”必须运行到最后。结果,在verilog中,您只能使用全局变量来完成此操作。

如果要切换到系统Verilog,则可以对任务使用ref参数。它应该起作用;

task test(input [7:0] input_task, ref [7:0] output_task);

答案 1 :(得分:0)

在Verilog中,任务的input自变量在进入任务时按值复制,而output自变量在退出任务时被复制。任务消耗时间时,任何东西都不会通过参数传递。 SystemVerilog添加了一个ref参数方向,这意味着该参数将作为引用传递。这样可以在任务处于活动状态时看到带有参数的活动:

task test(input [7:0] input_task, ref logic [7:0] output_task);

答案 2 :(得分:0)

我看不到原始海报的任何答复。但是,建议的解决方案对我不起作用。至少没有节奏韵律v15.20。 out_from_task1/2永远不会被驱动。

这应该是受良好支持的功能吗?

module tb();
 reg [7:0] out_from_task1;
 reg [7:0] out_from_task2;

 task automatic test;                                    
   input  [7:0] input_task;
   ref logic [7:0] output_task;
 begin 
     output_task  = 'b0;
 #4  output_task = input_task;
 #2  output_task = input_task +2;
     $display(input_task," ",output_task);
 end 
 endtask

 initial begin
   fork
     test(8'd10,out_from_task1);
     test(8'd8,out_from_task2);
   join
 end
endmodule