UVM: illegale Kombination von Fahrer-und verfahrensrechtlichen Zuordnung Warnung

Habe ich ein UVM testbench für einen kleinen block in meinem chip. In diesem gibt es einen Agenten mit einem Treiber, der Festplatten-Daten auf einem virtuellen interface, die wie folgt aussieht:

interface my_if (input bit clk);

  logic [3:0] opcode;

  //Clocking block for the driver
  clocking drvClk @(posedge clk);
    output opcode;
  endclocking

  //Clocking block for the monitor      
  clocking monClk @(posedge clk);
    input opcode;
  endclocking

endinterface

Ich über diese Schnittstelle in meinem Treiber so:

class my_driver extends uvm_driver #(my_tr);
  my_if vif;
  ...
  virtual task run_phase(uvm_phase phase);
    super.run_phase(phase);

    forever begin
      seq_item_port.get_next_item(req);

      //Drive the transaction onto the interface
      //and wait for next clock
      vif.opcode <= req.opcode;
      @(vif.drvClk);

      seq_item_port.item_done();
    end
  endtask
endclass

Soweit ich das beurteilen kann, ist dies der empfohlene Weg, Dinge zu tun, und es funktioniert gut. Das problem entsteht, wenn ich die Integration dieser agent ein höheres level testbench. In diesem Fall wird der agent ist jetzt passiv, und der Treiber wird nicht gebaut. Ich bin die Zuordnung der opcode-Wert an der Schnittstelle also dem monitor beobachten können. Hier ist ein Ausschnitt von meinem top-level-Kabelbaum:

module my_top();
  bit clk = 0;

  always #5 clk = !clk;

  //instantiate the interface
  my_if my_if_inst(.clk(clk));

  //instantiate my dut
  my_dut dut(...);

  //pull out the internal opcode signal and assign it
  //to the interface
  assign my_if_inst.opcode = dut.submodule.opcode;

  //Set the virtual interface inside the agent
  initial begin
    uvm_config_db#(virtual my_if)::set(uvm_root::get(),"uvm_test_top.tb.env.my_agent", "vif", my_if_inst);
  end 
endmodule

Wenn ich diese in der NC bekomme ich eine Warnung:

ncelab: *W,ICPAVW: Illegal combination of driver and procedural assignment to variable opcode detected (output clockvar found in clocking block)

Dies ist sinnvoll, da die Schnittstelle definiert das signal als Ausgang für die drvClk block, und ich mache eine Zuordnung auf der obersten Ebene. Ich kann nur diese Warnung ignorieren (der code funktioniert Prima) aber ich würde lieber code Sie in einer Weise, dass es läuft sauber. Was ist der empfohlene Weg, dies zu tun? Ich entledigte sich die Taktung block für den Fahrer und das funktioniert, aber ich denke ich werde mir für race-conditions, wenn ich das mache.

  • Ich zufällig zu stoßen ein ähnliches Problem. Überraschend VCS hatte keine Probleme kompilieren der gleiche code, aber Prägnanten haben. @dave_59 s Antwort ist richtig. Es ist ein überschreiben switch in Prägnanten, für diese aber, nicht sicher, warum
InformationsquelleAutor nguthrie | 2013-10-08
Schreibe einen Kommentar