sistem verilog bind utilizat împreună cu interfața (Programare, Sistem Verilog)

utilizator3295139 a intrebat.

Am definit o interfață în sistemul verilog și folosesc declarația bind pentru a lega la semnalele RTL interne. Vreau să pot forța semnalele RTL interne prin intermediul interfeței. Cu toate acestea, acest lucru face ca semnalul RTL să treacă la „x” dacă nu forțez aceste semnale în mod explicit, se pare că bind to interface are capacitatea de conducere. Nu vreau ca semnalul RTL să treacă la „x” când nimic nu îl forțează în acest caz, nu sunt sigur ce greșesc aici?

codul meu arată astfel, DUT fiind proiectarea:

interface myInf(
   inout RTL_a,
   inout RTL_b 
);

bind DUT myInf myInf_inst(
   .RTL_a(DUT.a),
   .RTL_b(DUT.b)
);

bind DUT myDrv(myInf_inst);

unde myDrv este un modul care conduce porturile de pe myInf.

În acest caz, DUT.a și DUT.b sunt semnale RTL interne, au driverul lor din proiect, dar vreau să le pot forța dacă este necesar. totuși, aceste semnale devin „x” atunci când le leg la myInf fără a le conduce efectiv.

Comentarii

  • Se pare că semnalele RTL vor avea mai multe drivere în acest caz, vă rog să mă corectați dacă greșesc, dar driverele multiple nu se vor rezolva la o valoare stabilă dacă toate driverele nu au aceleași valori. În plus, valorile implicite ale semnalelor (cu excepția cazului în care acestea sunt declarate ca fiind de tip systemverilog nou) sunt „X”. Oh, încă un lucru, va trebui să „eliberați” semnalele care sunt forțate. –  > Por wisemonkey.
1 răspunsuri
Greg

The inout semnale ar putea fi de tip non-net. Este mai bine să fii explicit în declarație și să le definești ca fiind inout wire. În interiorul secvenței interface, , se atribuie rețelele la un logic și inițializați logics la z. A non-z va aplica un driver, în timp ce o valoare z va permite ca semnalele să fie dirijate. Exemplu:

interface myInf(
   inout <i><b>wire</b></i> RTL_a,
   inout <i><b>wire</b></i> RTL_b 
);
  logic drv_a, drv_b;
  initial {drv_a,drv_b} = 'z; // z means not driving
  assign RTL_a = drv_a;
  assign RTL_b = drv_b;
endinterface

Pot exista drivere conflictuale, cum ar fi driverele normale din proiect. În acest caz, va trebui să suprascrieți driverul. Presupunând că semnalul care se suprascrie este un tip de rețea, acest lucru se face prin schimbarea instrucțiunilor de atribuire în assign <b>(supply1,suppl0)</b> RTL_a = drv_a;. Astfel se utilizează conceptul Verilog de putere de comandă. Atribuirea la z va menține toate celelalte drivere. Majoritatea rețelelor sunt comandate cu o intensitate de strong1,strong0 care este mai slabă decât supply1,supply0. Puterea de conducere nu va funcționa pentru tipurile de rețele care nu sunt rețele (de ex. logic & reg). Aceste tipuri de registre/variabile utilizează o abordare de tip „ultima atribuire câștigătoare”. Pentru mai multe informații despre puterea de acționare, citiți IEEE Std 1800-2012 secțiunile 28.11 până la 28.15


Exemplul de cod are câteva erori. Conexiunile pinilor pentru myInf_inst ar trebui să utilizeze referințe ierarhice în raport cu domeniul său de aplicare țintă. Cu excepția cazului în care nu există o instanță numită DUT în interiorul module DUT, , atunci DUT. trebuie omisă (a se vedea IEEE Std 1800-2012 § 23.11 Legarea codului auxiliar de domenii sau instanțe). Instrucțiunea bind pentru myDrv nu conține un nume de instanță. Codul ar trebui să fie:

bind DUT myInf myInf_inst(
   .RTL_a(a), <i>// no <b>DUT.</b></i>
   .RTL_b(b) <i>// no <b>DUT.</b></i>
);

bind DUT myDrv <i><b>myDrv_inst</b></i>(myInf_inst);

cod de exemplu: http://www.edaplayground.com/x/2NG