270 likes | 511 Views
Modelarea comportamentala concurenta. Dataflow modeling Capitolul 4. Modelarea concurenta. Specifica functionarea unui circuit fara a se referi in mod explicit la structura lui
E N D
Modelarea comportamentala concurenta Dataflow modeling Capitolul 4
Modelarea concurenta • Specifica functionarea unui circuit fara a se referi in mod explicit la structura lui • Functionarea este descrisa de fluxul de informatii din circuit utilizind in principal instructiuni concurente de asignare de semnal si instructiuni BLOCK • Instructiuni: • Asignari concurente de semnale • ASSERT concurente • Apeluri concurente de proceduri • BLOCK
Asignari concurente de semnal • Asignarile concurente de semnale (concurrent signal assignments) sint declansate de evenimente (sint de tip event triggered), adica se executa atunci cind apare un eveniment pe expresia care ii este asignata semnalului. • Asignarile secventiale de semnal se executa atunci cind se executa secventa respectiva in cadrul procesului => nu sint declansate de evenimentele din expresia asignata semnalului. Exemplu: ARCHITECTURE asignare_secventiala OF exemplu IS SIGNAL a, b, z : tip; BEGIN PROCESS(b) BEGIN a<=b; z<=a; END PROCESS; END ARCHITECTURE;
Asignari concurente de semnal ARCHITECURE asignare_concurenta OF exemplu IS SIGNAL a, b, z: tip; BEGIN a<=b; z<=a; END ARCHITECTURE; • Prima arhitectura (asignare_secventiala): • Cind are loc eveniment pe semnalul b se executa procesul • Semnalului a i se planifica noua valoare a lui b; • Semnalului z i se planifica valoarea lui a, care este vechea valoare a lui b.
Asignarea concurenta de semnal • A doua arhitectura (asignare_concurenta): • Daca are loc un eveniment pe b la momentul Tc, atunci se executa instructiunea a<=b • Deci lui a i se planifica o noua valoare la momentul Tc+Δ; • La Tc+ Δ are loc un eveniment pe a => se executa instuctiunea z<=a; • La Tc+2 Δ semnalul z va primi valoarea lui a, care este si noua valoare a lui b. A doua arhitectura este echivalenta cu: PROCESS(b) BEGIN a<=b; END PROCESS; PROCESS(a) BEGIN z<=a; END PROCESS;
Asignarea concurenta de semnal O instructiune concurenta de forma s<=x+y+z; -- x, y, z, s semnale este echivalenta cu: PROCESS BEGIN s<=x+y+z; WAIT ON x,y,z; END PROCESS;
Instructiunea conditionala de asignare de semnal • concurrent_signal_assignment::= • [POSTPONED] conditional_signal_assignment | • [POSTPONED] selected_signal_assignment; • conditional_signal_assignment::= • target<= [TRANSPORT|[REJECT time_expression] INERTIAL] conditional_waveforms; • conditional_waveforms::= • {waveform WHEN condition ELSE} • [waveform WHEN condition] • Instructiunea conditionala de asignare de semnal este executata de fiecare data cind are loc un eveniment pe unul din semnalele din formele de unda sau din conditii. • Conditiile se evalueaza pe rind in ordinea in care sint scrise. • Pentru prima conditie adevarata i se asigneaza semnalului forma de unda.
Instructiunea conditionala de asignare de semnal: procesul echivalent Exemplu. Intr-o arhitectura avem instructiunea: ARCHITECTURE ex OF ex IS BEGIN s<=x+y-2 AFTER 10ns WHEN i0=‘0’ AND i1=‘0’ ELSE x-y+2 AFTER 10ns WHEN i0=‘1’ AND i1=‘0’ ELSE x+y AFTER 7ns WHEN i0=‘0’ AND i1=‘1’ ELSE x-y AFTER 5ns; END ARCHITECUTE;
Instructiunea conditionala de asignare de semnal: procesul echivalent Instructiunea e echivalenta cu urmatorul proces: PROCESS BEGIN IF i0=‘0’ AND i1=‘0’ THEN s<= x+y-2 AFTER 10ns ; ELSIF i0=‘1’ AND i1=‘0’ THEN s<= x-y+2 AFTER 10ns; ELSIF i0=‘0’ AND i1=‘0’ THEN s<=x+y AFTER 7ns; ELSE s<=x-y AFTER 5ns; END IF; WAIT ON i0,i1,x,y; END PROCESS;
Instructiunea selectata de asignare de semnal • selected_signal_assignment::= • WITH expression SELECT • target <= [TRANSPORT|[REJECT time_expression]INERTIAL] selected_waveforms; • Selected_waveforms::= • {waveform WHEN choices,} • waveform WHEN choices • choices::= {choice,} • choice::=simple_expression | discrete_range | OTHERS • Cind are loc un eveniment pe oricare din driverele semnalelor din formele de unda sau din expresia selectorului se executa instructiunea, adica: • Se evalueaza expresia selectorului • Se asigneaza semnalului tinta forma de unda de pe ramura care contine valoarea selectorului. • Alegerile (choices) trebuie sa fie distincte si sa acopere toate valorile selectorului.
Instructiunea selectata de asignare de semnal: procesul echivalent Instructiunea: WITH a+b SELECT s<= x+y WHEN 0|1|2, x-y AFTER 5ns WHEN 3 TO 10, UNAFFECTED WHEN OTHERS; Este echivalenta cu: PROCESS BEGIN CASE a+b IS WHEN 0|1|2 => s<=x+y; WHEN 3 TO 10 => s<= x-y AFTER 5ns; WHEN OHTERS=> NULL; END CASE; WAIT ON a,b,x,y; END PROCESS;
Valoarea UNAFFECTED • Exista situatii cind se doreste ca unui semnal sa nu i se modifice valoarea • Acest lucru se poate face folosind UNAFFECTED • In acest caz nu au loc schimbari pe driverul semnalului • Daca avem x <= x; atunci au loc schimbari ! • Echivalentul secvential pentru UNAFFECTEFD este instructiunea NULL;
Instructiunea ASSERT concurenta • Are aceeasi forma ca si ASSERT secventiala. • Se executa de fiecare data cind are loc un eveniment pe oricare din semnalele din conditii. • Exemplu: • ASSERT s1/=s2 -- /= inseamna diferit • REPORT “erroare, s1=s2”SEVERITY ERROR; • Procesul echivalent: • PROCESS • BEGIN • ASSERT s1/=s2 REPORT “eroare, s1=s2” SEVERITY ERROR; • WAIT ON s1,s2; • END PROCESS;
Apeluri concurente de proceduri • In VHDL exista proceduri si functii. • FUNCTION returneaza o valoare • PROCEDURE efectueaza calcule • Apelurile de functii apar in expresii, adica nu pot fi instructiuni separate. • Apelurile de proceduri pot fi instructiuni secventiale sau concurente. • Un apel concurent de procedura este echivalent cu procesul continind • apelul secvential • si o instructiune WAIT ce contine in clauza de senzitivitate toate semnalele care sint parametri de mod IN sau INOUT ai procedurii • Un apel concurent de procedura nu permite ca procedura sa aiba parametri apartinind clasei VARIABLE.
Apeluri concurente de proceduri --declaratia de procedura PROCEDURE compute(SIGNAL a,b: IN INTEGER; SIGNAL res: OUT INTEGER; SIGNAL x: INOUT INTEGER) BEGIN … END PROCEDURE; --apelul concurent de procedura (intr-o arhitectura): ARCHITECTURE apel_proc OF ex IS SIGNAL siga, sigb,sigres, sigx: INTEGER; BEGIN … compute(siga, sigb, sigres, sigx); END ARCHITECTURE;
Apeluri concurente de proceduri -- arhitectura este echivalenta cu: ARCHITECTURE echiv OF ex IS SIGNAL siga, sigb, sigres, sigx : INTEGER; PROCESS BEGIN compute(siga, sigb, sigres, sigx); WAIT ON siga, sigb, sigx; END PROCESS; END ARCHITECTUTRE;
Instructiunea BLOCK [Bha95] • Este o instructiune concurenta • Poate avea trei utilizari: • Pentru a dezactiva driverele unui semnal (la blocuri gardate) • Pentru a limita vizibilitatea unor declaratii (inclusiv declaratii de semnal) • Pentru a partitiona un proict in scopul cresterii claritatii programului: • De ex se descrie un microprocesor si exista blocul registrelor, al ALU, al unitatii de control, etc, in blocul registrelor poate fi un bloc pt fiecare registru
BLOCK Descriere BNF: Block_statement::= Block_label: BLOCK [(guard_expression)][IS] [Block_header] [Block_declarative_part] BEGIN concurrent_statements END BLOCK [Block_label];
BLOCK • Block_label -eticheta este obligatorie. • Block_header - header-ul blocului • daca exista, descrie interfata blocului cu exteriorul, adica porturi si generice (ca si la componente) • deoarece blocurile nu se pot instantia, utilitatea headerului e mai mica decit la componente • Block_declarative_part • partea de declaratii este optionala • Poate contine declaratii de: • Tipuri, constante, semnale • NU poate contine: declaratii de variabile • Orice declaratie care apare in partea de declaratii a blocului este vizibila doar in interiorul blocului • Corpul blocului: intre BEGIN si END BLOCK: • Poate contine oricite instructiuni concurente, inclusiv nici una • Poate contine alte instructiuni BLOCK, pe oricit de multe niveluri. • Eticheta de la sfirsitul blocului e optionala, dar daca apare, trebuie sa fie aceeasi ca la inceputul blocului. • Simbolul ; de la sfirsit este obligatoriu
Blocuri si garzi • Guard_expression: - • Daca o expresie garda apare in cadrul blocului, atunci se va declara in mod implicit un semnal numit GUARD, de tip BOOLEAN. • Valoarea semnalului GUARD e data de expresia garzii (guard expression), care trebuie sa fie de tip BOOLEAN. • In expresia garda pot aparea doar semnale, NU si variabile. • Valoarea semnalului GUARD se actualizeaza atunci cind se modifica valoarea garzii. • Asignarile de semnal din interiorul blocului pot utiliza semnalul GUARD pt a activa / dezactiva driverul semnalelor respective. • Exemplu: • b1: BLOCK (strobe=‘1’) • BEGIN • z <= GUARDED NOT a; • END BLOCK b1;
Blocuri si garzi • Cuvintul cheie GUARDED poate fi utilizat optional la asignari concurente de semnal in interiorul blocului • In exemplul anterior • Expresia garda este (strobe=‘1’) • GUARD <= (strobe=‘1’); • Cind se modifica strobe se va modifica si semnalul GUARD • Cind semnalul garda (GUARD) are valoarea TRUE atunci semnalului z i se asigneaza valoarea expresiei (NOT a) • Daca GUARD e FALSE atunci driverul semnalului z e dezactivat, adica: • Evenimentele care apar pe semnalul a nu afecteaza valoarea semnalului z • Semnalul z isi pastreaza valoarea anterioara.
Asignarea gardata de semnal • Este singura instructiune a carei semantica este afectata de includerea sa intr-un bloc gardat • Aceste instructiuni modeleaza logica secventiala (elemente hardware declansate de anumite evenimente) • Functionarea instructiunii: • De fiecare data cind are loc un eveniment pe oricare din semnalele din expresia semnalului tinta si daca semnalul garda are valoarea TRUE sau isi modifica valoarea din FALSE in TRUE se va executa instructiunea de asignare gardata (semnalului tinta i se planifica noi valori) • Daca valoarea semnalului garda este FALSE atunci driverul semnalului tinta ramine nemodificat (si valoarea semnalului ramine nemodificata)
Procesul echivalent bl: BLOCK (guard_expression) --SIGNAL GUARD: BOOLEAN; BEGIN sig<= GUARDED waveform_expression; END BLOCK b1; Este echivalent cu bl:BLOCK (guard_expression) --SIGNAL GUARD: BOOLEAN; BEGIN PROCESS BEGIN IF GUARD THEN sig<= waveform_expression; END IF; WAIT ON GUARD, signals_in_waveform_expression; END PROCESS; END BLOCK;
Alte exemple Semnalul GUARD, desi nu este declarat explicit, poate fi folosit explicit in interiorul blocului. Exemplu: b2:BLOCK (set=‘1’ AND reset=‘0’) BEGIN q<= ‘1’ WHEN GUARD ELSE ‘0’; END BLOCK b2; Instructiunea de asignare de semnal nu este gardata => driverul semnalului q nu este dezactivat niciodata.
Alte exemple Este posibil si sa se declare explicit un semnal numit GUARD de tip BOOLEAN, sa i se asigneze o expresie si apoi sa fie utilizate asignari gardate in interiorul blocului: B3: BLOCK SIGNAL GUARD: BOOLEAN; BEGIN GUARD <= reset=‘0’ AND set=‘1’; q <= GUARDED d; END BLOCK;
Exemplu de bistabil D • ENTITY dff IS • PORT(clk, d: IN BIT; q, qbar : OUT BIT); • END dff; • ARCHITECTURE garda OF dff IS • BEGIN • B: BLOCK(clk=‘1’ AND NOT clk’STABLE) • -- daca garda ar fi fost doar (clk=‘1’) era cu comutare pe • -- nivel, acum e cu comutare pe front • SIGNAL temp: BIT; • BEGIN • temp<=GUARDED d; • q<=temp; • qbar<=NOT temp; • END BLOCK; • END ARCHITECTURE; • semnalul temp e vizibil doar in interiorul blocului • clk’STABLE este un semnal de tip BOOLEAN care este TRUE daca clk nu a avut evenimente in ciclul de simulare curent
Exemplu de limitare a vizibilitatii ARCHITECTURE ex OF ex IS SIGNAL s1, s2: INTEGER; BEGIN b1: BLOCK SIGNAL s3, s4: INTEGER; BEGIN b2: BLOCK SIGNAL s1, s4, s5: INTEGER; -- s1 si s4 --suprascrise BEGIN s4<=...--se refera la s4 din blocul b2 b1.s4 <= ...--ca sa ne referim la s4 din b1 END BLOCK b2; END BLOCK b1; END ARCHITECTURE;