任务中使用非阻塞的Systemverilog问题

问题描述 投票:0回答:1

当我在任务中使用非阻塞(如下例)时,第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 system-verilog
1个回答
0
投票

发布的代码中的一个问题是任务没有名称,因此无法调用。
我给它命名,创建了一个时钟并打印了变量。

您编写的任务不是使用 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
© www.soinside.com 2019 - 2024. All rights reserved.