Неудачное назначение в SystemVerilog - PullRequest
0 голосов
/ 30 мая 2020

Я пишу ldpc_if.sv и ldpc_transaction.sv следующим образом.

"ldpc_if.sv"

interface ldpc_if#(parameter COLS=9216, parameter ROWS=1024) (input clk, input reset);
  logic [COLS-ROWS-1:0] en_enq_data;
  logic                 en_enq_valid;
  logic                 en_enq_ready;

  logic [ROWS-1:0]      en_deq_data;
  logic                 en_deq_valid;
  logic                 en_deq_ready;

  logic [COLS-1:0]      de_enq_data;
  logic                 de_enq_valid;
  logic                 de_enq_ready;

  logic [COLS-1:0]      de_deq_data;
  logic                 de_deq_valid;
  logic                 de_deq_ready;

 endinterface

"ldpc_transaction.sv"

class ldpc_transaction#(parameter WIDTH=8192) extends uvm_sequence_item;
  rand bit [WIDTH-1:0] data;

  bit [8191:0]  encode_data_in;
  bit [1023:0]  encode_data_out;

  bit [9215:0]  decode_data;

  `uvm_object_utils(ldpc_transaction)

  function new(string name = "ldpc_transaction");
    super.new();
  endfunction
endclass

И Я пишу ldpc_monitor.sv для интерфейса монитора.

task ldpc_monitor::collect_one_pkt(ldpc_transaction tr);
  while(1) begin
  @(posedge vif.clk);
  if(vif.en_enq_valid && vif.en_enq_ready) break;
  end

  tr.encode_data_in <= vif.en_enq_data;

  while(1) begin
    @(posedge vif.clk)
    if(vif.en_deq_valid && vif.en_deq_ready) break;
  end

  tr.encode_data_out <= vif.en_deq_data;

 while(1)begin
   @(posedge vif.clk)
   if(vif.de_deq_valid && vif.de_deq_ready)begin
     break;
   end
 end
 tr.decode_data <= vif.de_deq_data;
 $display("tr.decode_data = %0h", tr.decode_data);
 $display("vif.de_deq_data = %0h", vif.de_deq_data);
endtask

vcs успешно компилирует все файлы. Однако tr.decode_data всегда отображается как ноль. Но vif.de_deq_data правильно. Почему vif.de_deq_data не присваивается tr.decode_data.

1 Ответ

1 голос
/ 30 мая 2020

Это потому, что $ display, который вы использовали для отображения транзакции, блокируется. И наоборот, вы использовали неблокирующее присвоение для установки tr.decode_data.

Таким образом, ваш оператор $ display фактически выполняется перед вашим назначением. Получение 0 - это просто артефакт вашего симулятора - может быть любой случайный материал в памяти, присвоенный этой переменной (хотя большинство симуляторов просто сбрасываются на 0).

Быстрый поиск показал этот полезный пример, который точно иллюстрирует вашу проблему.

https://verificationguide.com/systemverilog/systemverilog-nonblocking-assignment/

...