我正在寻找一条语句(例如任务/功能),它具有在任务结束时连续分配(局部变量的)输出而不是一次的能力。 例如:
import System.IO
main = do
hSetNewlineMode stdin universalNewlineMode
interact $ unlines . filter ((<10) . length) . lines
我得到的值是最后一个值,然后 out_from_task1 的值是12。我需要查看信号 out_from_task1 发生变化。前10个,过一会儿12个。
我可以在不使用Verilog的全局变量的情况下执行此操作吗? 这一切都是从在测试台中并行执行更多任务开始的。
答案 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