当我在任务中使用非阻塞(如下例)时,第8个时钟周期的output_data将为X,我该如何解决这个问题?
logic [7:0]output_data=0;
initial begin
repeat(8)@(posedge clk);
drive_data(output_data);
repeat(8)@(posedge clk);
$finish();
end
task(output [7:0] out);
output_data<=8'hFF;
endtask
我尝试过自动和参考,但会发生错误,我希望它的行为像触发器。
发布的代码中的一个问题是任务没有名称,因此无法调用。
我给它命名,创建了一个时钟并打印了变量。
您编写的任务不是使用 Verilog 在 RTL 中建模 ff 的基本方法。
我放置了 RTL FF 模型来重新定时 output_data 信号。
module tb ();
bit clk;
logic [7:0]output_data;
logic [7:0] q;
always #5 clk = !clk;
initial begin
$dumpfile("dump.vcd"); $dumpvars;
$monitor("---- time = %0t, output_data = %h, q = %h--",$time,output_data,q);
//
repeat(8)@(posedge clk);
drive_data(output_data);
repeat(8)@(posedge clk);
$finish();
end
task drive_data (output [7:0] out);
output_data<=8'hFF;
endtask
// model a flop, will be a 1 clk delay based on output_data
always @(posedge clk)
q <= output_data;
endmodule
产品
xcelium> run
---- time = 0, output_data = xx, q = xx--
---- time = 75, output_data = ff, q = xx--
---- time = 85, output_data = ff, q = ff--
Simulation complete via $finish(1) at time 155 NS + 0