<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ro">
	<id>http://wiki.dcae.pub.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Gvpopescu</id>
	<title>WikiLabs - Contribuții utilizator [ro]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.dcae.pub.ro/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Gvpopescu"/>
	<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php/Special:Contribu%C8%9Bii/Gvpopescu"/>
	<updated>2026-04-09T06:52:43Z</updated>
	<subtitle>Contribuții utilizator</subtitle>
	<generator>MediaWiki 1.35.14</generator>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_12_:_Exercitii_cu_circuite_secventiale&amp;diff=8133</id>
		<title>CID aplicatii 12 : Exercitii cu circuite secventiale</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_12_:_Exercitii_cu_circuite_secventiale&amp;diff=8133"/>
		<updated>2025-07-17T04:43:00Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Teorie==&lt;br /&gt;
Acest laborator are rolul de a sedimenta cunostintele dobandite anterior. &lt;br /&gt;
&lt;br /&gt;
El consta in exercitii separate, unele date ca subiect la lucrarea 2 in anii anteriori.&lt;br /&gt;
&lt;br /&gt;
Unele exercitii contin si automate. Daca acestea nu au fost inca predate, puteti ignora partea aceea de circuit.&lt;br /&gt;
&lt;br /&gt;
Dupa cum se poate observa, exemplele sunt diverse ca domeniu de aplicabilitate. Prin asta se doreste a se arata importanta si diversitatea circuitelor digitale in societatea moderna.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exercitii==&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 1: password checker===&lt;br /&gt;
&lt;br /&gt;
SystemVerilog suporta codul ASCII deci puteti introduce si litere/string-uri care vor fi tratate prin reprezentarea lor binara.&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/5/5c/Subiect_l2_password_checker.pdf password_checker.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 2: PWM static pe RGB ===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/f/f2/Subiect_pwm_l2.pdf PWM_static_pe_RGB.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 3: calculator de siruri dupa formula data===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/a/a2/Subiect_l2_sir_calculator.pdf calculator_siruri.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 4: UART tx - structural===&lt;br /&gt;
&lt;br /&gt;
UART este un standard pentru transmisiune de date seriale. Pentru o descriere a protocolului puteti citi: [https://www.circuitbasics.com/basics-uart-communication/ functionare_uart]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/d/d0/Subiect_l2_uart_tx.pdf uart_tx.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 5: UART rx - behavioural=== &lt;br /&gt;
&lt;br /&gt;
Daca ati inteles cum functioneaza mecanismul de UART (si pentru a testa functionarea TX de la exercitiul anterior) puteti scrie modulul de RX (receiver) al protocolului, astfel incat cele 2 sa comunice intre ele.&lt;br /&gt;
&lt;br /&gt;
La nivel de TB ar fi amandoua instantiate si conectate intre ele. &lt;br /&gt;
&lt;br /&gt;
UART RX ar trebui sa scoata un puls al semnalului &amp;quot;valid&amp;quot; impreuna cu 8 biti de date daca transmisiunea a fost efectuata cu succes, datele care ies din el fiind cele care au intrat in modulul de tx. &lt;br /&gt;
&lt;br /&gt;
Pentru a compara abordarea structurala cu cea comportamentala, acest modul se doreste a fi facut comportamental.&lt;br /&gt;
In always-urile acestuia vor aparea mecanisme de numarare care practic alcatuiesc un mic FSM de control. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 6: microcontrollere - oscillator control register=== &lt;br /&gt;
&lt;br /&gt;
Acest subiect prezinta un modul simplificat al mecanismului de control al oscilatorului de pe un microcontroller. Acest modul controleaza generarea smenalului de ceas ce se propaga catre microcontroller si deci viteza la care sistemul va functiona.&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/0/09/Subiect_l2_uc_osccon.pdf uc_osccon.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 7: Led care se invarte===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/a/af/L2_led_care_se_invarte.pdf Led_care_se_invarte.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 8: Media dintre cel mai mic și cel mai mare număr===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/0/0c/Lucrarea2_Subiect_pentru_wiki.pdf Media_dintre_cel_mai_mic_si_cel_mai_mare_numar]&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_12_:_Exercitii_cu_circuite_secventiale&amp;diff=8132</id>
		<title>CID aplicatii 12 : Exercitii cu circuite secventiale</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_12_:_Exercitii_cu_circuite_secventiale&amp;diff=8132"/>
		<updated>2025-07-17T04:42:19Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Teorie==&lt;br /&gt;
Acest laborator are rolul de a sedimenta cunostintele dobandite anterior. &lt;br /&gt;
&lt;br /&gt;
El consta in exercitii separate, unele date ca subiect la lucrarea 2 in anii anteriori.&lt;br /&gt;
&lt;br /&gt;
Unele exercitii contin si automate. Daca acestea nu au fost inca predate, puteti ignora partea aceea de circuit.&lt;br /&gt;
&lt;br /&gt;
Dupa cum se poate observa, exemplele sunt diverse ca domeniu de aplicabilitate. Prin asta se doreste a se arata importanta si diversitatea circuitelor digitale in societatea moderna.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exercitii==&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 1: password checker===&lt;br /&gt;
&lt;br /&gt;
SystemVerilog suporta codul ASCII deci puteti introduce si litere/string-uri care vor fi tratate prin reprezentarea lor binara.&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/5/5c/Subiect_l2_password_checker.pdf password_checker.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 2: PWM static pe RGB ===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/f/f2/Subiect_pwm_l2.pdf PWM_static_pe_RGB.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 3: calculator de siruri dupa formula data===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/a/a2/Subiect_l2_sir_calculator.pdf calculator_siruri.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 4: UART tx - structural===&lt;br /&gt;
&lt;br /&gt;
UART este un standard pentru transmisiune de date seriale. Pentru o descriere a protocolului puteti citi: [https://www.circuitbasics.com/basics-uart-communication/ functionare_uart]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/d/d0/Subiect_l2_uart_tx.pdf uart_tx.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 5: UART rx - behavioural=== &lt;br /&gt;
&lt;br /&gt;
Daca ati inteles cum functioneaza mecanismul de UART (si pentru a testa functionarea TX de la exercitiul anterior) puteti scrie modulul de RX (receiver) al protocolului, astfel incat cele 2 sa comunice intre ele.&lt;br /&gt;
&lt;br /&gt;
La nivel de TB ar fi amandoua instantiate si conectate intre ele. &lt;br /&gt;
&lt;br /&gt;
UART RX ar trebui sa scoata un puls al semnalului &amp;quot;valid&amp;quot; impreuna cu 8 biti de date daca transmisiunea a fost efectuata cu succes, datele care ies din el fiind cele care au intrat in modulul de tx. &lt;br /&gt;
&lt;br /&gt;
Pentru a compara abordarea structurala cu cea comportamentala, acest modul se doreste a fi facut comportamental.&lt;br /&gt;
In always-urile acestuia vor aparea mecanisme de numarare care practic alcatuiesc un mic FSM de control. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 6: microcontrollere - oscillator control register=== &lt;br /&gt;
&lt;br /&gt;
Acest subiect prezinta un modul simplificat al mecanismului de control al oscilatorului de pe un microcontroller. Acest modul controleaza generarea smenalului de ceas ce se propaga catre microcontroller si deci viteza la care sistemul va functiona.&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/0/09/Subiect_l2_uc_osccon.pdf uc_osccon.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 7: Led care se invarte===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/a/af/L2_led_care_se_invarte.pdf Led_care_se_invarte.pdf]&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 8: Media dintre cel mai mic și cel mai mare număr===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/0/0c/Lucrarea2_Subiect_pentru_wiki.pdf Media_dintre_cel_mai_mic_si_cel_mai_mare_numar]&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_12_:_Exercitii_cu_circuite_secventiale&amp;diff=8131</id>
		<title>CID aplicatii 12 : Exercitii cu circuite secventiale</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_12_:_Exercitii_cu_circuite_secventiale&amp;diff=8131"/>
		<updated>2025-07-17T04:39:36Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Teorie==&lt;br /&gt;
Acest laborator are rolul de a sedimenta cunostintele dobandite anterior. &lt;br /&gt;
&lt;br /&gt;
El consta in exercitii separate, unele date ca subiect la lucrarea 2 in anii anteriori.&lt;br /&gt;
&lt;br /&gt;
Unele exercitii contin si automate. Daca acestea nu au fost inca predate, puteti ignora partea aceea de circuit.&lt;br /&gt;
&lt;br /&gt;
Dupa cum se poate observa, exemplele sunt diverse ca domeniu de aplicabilitate. Prin asta se doreste a se arata importanta si diversitatea circuitelor digitale in societatea moderna.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exercitii==&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 1: password checker===&lt;br /&gt;
&lt;br /&gt;
SystemVerilog suporta codul ASCII deci puteti introduce si litere/string-uri care vor fi tratate prin reprezentarea lor binara.&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/5/5c/Subiect_l2_password_checker.pdf password_checker.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 2: PWM static pe RGB ===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/f/f2/Subiect_pwm_l2.pdf PWM_static_pe_RGB.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 3: calculator de siruri dupa formula data===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/a/a2/Subiect_l2_sir_calculator.pdf calculator_siruri.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 4: UART tx - structural===&lt;br /&gt;
&lt;br /&gt;
UART este un standard pentru transmisiune de date seriale. Pentru o descriere a protocolului puteti citi: [https://www.circuitbasics.com/basics-uart-communication/ functionare_uart]&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/d/d0/Subiect_l2_uart_tx.pdf uart_tx.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 5: UART rx - behavioural=== &lt;br /&gt;
&lt;br /&gt;
Daca ati inteles cum functioneaza mecanismul de UART (si pentru a testa functionarea TX de la exercitiul anterior) puteti scrie modulul de RX (receiver) al protocolului, astfel incat cele 2 sa comunice intre ele.&lt;br /&gt;
&lt;br /&gt;
La nivel de TB ar fi amandoua instantiate si conectate intre ele. &lt;br /&gt;
&lt;br /&gt;
UART RX ar trebui sa scoata un puls al semnalului &amp;quot;valid&amp;quot; impreuna cu 8 biti de date daca transmisiunea a fost efectuata cu succes, datele care ies din el fiind cele care au intrat in modulul de tx. &lt;br /&gt;
&lt;br /&gt;
Pentru a compara abordarea structurala cu cea comportamentala, acest modul se doreste a fi facut comportamental.&lt;br /&gt;
In always-urile acestuia vor aparea mecanisme de numarare care practic alcatuiesc un mic FSM de control. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 6: microcontrollere - oscillator control register=== &lt;br /&gt;
&lt;br /&gt;
Acest subiect prezinta un modul simplificat al mecanismului de control al oscilatorului de pe un microcontroller. Acest modul controleaza generarea smenalului de ceas ce se propaga catre microcontroller si deci viteza la care sistemul va functiona.&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/0/09/Subiect_l2_uc_osccon.pdf uc_osccon.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 7: Led care se invarte===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/a/af/L2_led_care_se_invarte.pdf Led_care_se_invarte.pdf]&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 8: Media dintre cel mai mic și cel mai mare număr===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/index.php/Fi%C8%99ier:Lucrarea2_Subiect_pentru_wiki.pdf Media_dintre_cel_mai_mic_si_cel_mai_mare_numar]&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Lucrarea2_Subiect_pentru_wiki.pdf&amp;diff=8130</id>
		<title>Fișier:Lucrarea2 Subiect pentru wiki.pdf</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Lucrarea2_Subiect_pentru_wiki.pdf&amp;diff=8130"/>
		<updated>2025-07-17T04:39:15Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_5_:_Exercitii_cu_circuite_combinationale&amp;diff=8129</id>
		<title>CID aplicatii 5 : Exercitii cu circuite combinationale</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_5_:_Exercitii_cu_circuite_combinationale&amp;diff=8129"/>
		<updated>2025-07-17T04:29:28Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Exercitiul 8: Unitate aritmetico-logică (ALU) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Teorie==&lt;br /&gt;
&lt;br /&gt;
Acest laborator are rolul de a sedimenta cunostiintele dobandite anterior. &lt;br /&gt;
&lt;br /&gt;
El consta in exercitii separate, unele date ca subiect la lucrarea 1 in anii anteriori si cateva notiuni de teorie si sintaxa ajutatoare.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Teorie: Parametrizare==&lt;br /&gt;
Parametrizarea este un mod de a generaliza codul scris pentru a nu fi nevoie sa scrii acelasi modul de mai multe ori doar pentru ca circuitul isi schimba o dimensiune. &lt;br /&gt;
&lt;br /&gt;
Pentru a intelege mai clar avantajele si sintaxa urmariti urmatorul exemplu:&lt;br /&gt;
&lt;br /&gt;
Fisierul sumator.sv:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module sumator # // &amp;lt;= diez deoarece urmeaza lista cu paramteri&lt;br /&gt;
				( // parametri &lt;br /&gt;
					parameter data_size = 4 // valoare default 4&lt;br /&gt;
					// alti parametri aici daca este nevoie, separati prin virgula&lt;br /&gt;
				)&lt;br /&gt;
				( // interfata &lt;br /&gt;
					input logic [data_size-1:0] in0, // si pot folosii parametrul &amp;quot;data_size&amp;quot; pentru dimensiunea bus-ului&lt;br /&gt;
					input logic [data_size-1:0] in1,&lt;br /&gt;
					output logic [data_size-1:0] out0&lt;br /&gt;
				);&lt;br /&gt;
&lt;br /&gt;
assign out0 = in0 + in1;				&lt;br /&gt;
				&lt;br /&gt;
endmodule &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cand se instantiaza un modul parametrizat, se specifica valorile parametrilor astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
 sumator # ( // parametri &lt;br /&gt;
		.data_size(8)   // se genereaza un sumator pe 8b&lt;br /&gt;
	) &lt;br /&gt;
        nume_instanta_0&lt;br /&gt;
	( // interfata &lt;br /&gt;
		.in0(fir_in0), &lt;br /&gt;
		.in1(fir_in1),&lt;br /&gt;
		.out0(fir_out0)&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
 sumator # ( // parametri &lt;br /&gt;
		.data_size(32)  // se genereaza un sumator pe 32b&lt;br /&gt;
	) &lt;br /&gt;
        nume_instanta_1&lt;br /&gt;
	( // interfata &lt;br /&gt;
		.in0(fir_in0), &lt;br /&gt;
		.in1(fir_in1),&lt;br /&gt;
		.out0(fir_out1)&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
 sumator nume_instanta_2 // se genereaza un sumator de dimensiune default, aici 4, asa cum e scris in modulul &amp;quot;sumator&amp;quot;&lt;br /&gt;
	( // interfata &lt;br /&gt;
		.in0(fir_in0), &lt;br /&gt;
		.in1(fir_in1),&lt;br /&gt;
		.out0(fir_out2)&lt;br /&gt;
	);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Puteti folosi parametrizarea in exercitiul 3 de mai jos. Acolo sunt 2 tipuri de multiplexoare, unul cu intrarile pe 1 bit si unul cu intrarile pe 2 biti. Poate fi scris un singur modul parametrizat care sa acopere ambele situatii.&lt;br /&gt;
&lt;br /&gt;
==Teorie: Concatenarea==&lt;br /&gt;
&lt;br /&gt;
Pentru o mai usoara conectare a firelor sau pentru o mai buna organizare si expresivitate a codului, de multe ori este util ca fire individuale sa fie grupate impreuna sau ca un bus de mai multi biti sa fie separat in fire individuale. Acest lucru se face folosind concatenarea, prin simbolurile &amp;quot;{ }&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un exemplu de folosire a concatenarii este oferit mai jos.&lt;br /&gt;
Un sumator pe 8b are rezultatul pe maxim 9b, in cazul in care ambele numere sunt mari. Astfel apare un bit de carry out. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module sumator ( &lt;br /&gt;
            input logic [7:0] in0,&lt;br /&gt;
            input logic [7:0] in1,&lt;br /&gt;
            output logic [7:0] out0,&lt;br /&gt;
            output logic carry_out&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
assign {carry_out,out0} = in0 + in1; // fac suma intre in0 si in1 iar rezultatul il pun pe cei 9b alcatuiti din: 1b carry_out si 8b out0, in ordinea asta&lt;br /&gt;
&lt;br /&gt;
endmodule       &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Se pot concatena oricat de multe semnale, puse in &amp;quot;{ }&amp;quot; si separate prin virgula. Atentie la dimensiunile firelor care se concateneaza.&lt;br /&gt;
&lt;br /&gt;
Se poate de asemenea face concatenare si la dreapta egalului, astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
assign fir_pe_10_b = {fir_pe_3b,fir_pe_5b,fir_pe_1b,fir_pe_1b};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In exemplul anterior ultimi 2b ai &amp;quot;fir_pe_10_b&amp;quot; vor avea mereu aceeasi valoare, provenind din acelasi fir. Sintaxa SystemVerilog permite asta.&lt;br /&gt;
&lt;br /&gt;
Puteti folosii concatenarea, in exercitiul 2, la flag-ul de overflow.&lt;br /&gt;
&lt;br /&gt;
==Teorie: Constante ca intrari in circuite==&lt;br /&gt;
In cazul in care se doreste scrierea unor constante la intrarea unor module, acestea se pun direct intre paranteze la instantiere. &lt;br /&gt;
De exemplu, pentru multiplexorul de jos din subiectul &amp;quot;alu structural&amp;quot;, intrarea &amp;quot;in3&amp;quot; este conectata la valoarea &amp;quot;1&amp;quot;. Sintaxa pentru aceasta este: &amp;quot;.in3(1),&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Teorie: &amp;quot;_&amp;quot;==&lt;br /&gt;
Simbolul &amp;quot;_&amp;quot; (underscore) este ignorat de SystemVerilog si ajuta vizual la citirea semnalelor pe mai multi biti. De exemplu 16&amp;#039;b1010010111110000 este identic cu 16&amp;#039;b1010_0101_1111_0000, al doilea fiind totusi mai usor de citit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exercitii==&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 0: Repararea erorilor===&lt;br /&gt;
Arhiva de mai jos contine mai multe proiecte in Vivado, fiecare avand cate o eroare de sintaxa sau de logica. In vederea aprofundari cunostiintelor voastre (si pentru lucrarea de saptamana urmatoare), incercati sa le parcurgeti si sa rezolvati toate problemele. &lt;br /&gt;
Pe langa proiecte in sine, in arhiva se afla si un fisier text cu o introducere, rezolvarile si explicatiile pentru fiecare situatie.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1cNTpQC54_JEeSk8SxgHTEdGtobCn_-EI/view?usp=drive_link Arhiva_proiecte_cu_erori.zip]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 1: ALU - descriere comportamentala===&lt;br /&gt;
Descrieți comportamental o unitate aritmetico-logică (ALU) care are la intrare 2 numere binare de câte 8 biți și poate calcula următoarele funcții:&lt;br /&gt;
:- suma celor două numere&lt;br /&gt;
:- diferența celor două numere&lt;br /&gt;
:- operații logice bit cu bit (bitwise): SI, SAU, XOR și inversele lor&lt;br /&gt;
:- operandul din stanga trece neschimbat&lt;br /&gt;
:- operandul din dreapta trece neschimbat&lt;br /&gt;
:- numărul din stânga este deplasat la stânga cu nr. de poziții indicat de numărul din dreapta&lt;br /&gt;
:- numărul din stânga este deplasat la dreapta cu nr. de poziții indicat de numărul din dreapta&lt;br /&gt;
&lt;br /&gt;
Funcția executată la un anumit moment este determinată de configurația binară de pe intrarea de comandă (function).&lt;br /&gt;
&lt;br /&gt;
ALU are de asemenea intrare de carry și ieșire de carry, plus alte două ieșiri - indicatori - pentru cazurile când rezultatul este zero și când cei doi operanzi sunt egali.&lt;br /&gt;
&lt;br /&gt;
Intrarea de control va fi facuta pe 4 biti ca sa permita existenta a 16 operatii posibile. Fiecare numar de pe intrarea de control (combinatie de 0 si 1) va reprezenta o operatie din cele de mai sus. Scrierea se va face folosind un bloc &amp;quot;case&amp;quot; in functie de aceasta intrare. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 2: ALU - descriere structurala===&lt;br /&gt;
 &lt;br /&gt;
[https://wiki.dcae.pub.ro/images/8/8f/Subiect_big_alu.pdf subiect_alu.pdf]&lt;br /&gt;
	&lt;br /&gt;
Daca se doreste selectarea doar a anumitor biti dintr-un bus (cum se vrea din instruction) acest lucru se poate face in 2 feluri:&lt;br /&gt;
&lt;br /&gt;
a) cu fir aditional:&lt;br /&gt;
:&amp;#039;&amp;#039;wire [1:0] fir_aditional1;&amp;#039;&amp;#039;&lt;br /&gt;
:&amp;#039;&amp;#039;assign fir_aditional1 = instruction[11:10];&amp;#039;&amp;#039;&lt;br /&gt;
:// apoi la instantiere: &amp;#039;&amp;#039;.sel(fir_aditional1),&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
b) direct in instantiere;&lt;br /&gt;
:la instantierea celor 2 mux4 din stanga, direct: &lt;br /&gt;
::&amp;#039;&amp;#039;.sel(instruction[11:10]),&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Pentru a scrie mai putin (a nu face toate modulele de calcul separat + instantierea lor) si pentru ca e vorba de operatii simple, se poate pune operatia cu assign direct in top pe un fir declarat acolo, sau si mai prescurtat, direct operatia dorita cand se intantiaza modulul in care aceasta intra. De exemplu, pentru operatia de shift la dreapta care intra in primul multiplexor, se poate pune:  &amp;quot;.in0(data0 &amp;gt;&amp;gt; data1),&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 3: Multiplexoare===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/3/3a/Subiect_muxes.pdf subiect_muxes.pdf]&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 4: Rom/Look-up table===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/2/2e/Subiect_rom_luts.pdf rom_luts.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 5: Sumator cu reprezentare in cifre zecimale===&lt;br /&gt;
Proiectati si verificati un sumator zecimal pentru numere cu 2 cifre&lt;br /&gt;
&lt;br /&gt;
Modulul de top (Figura 1) este alcatuit din 2 blocuri de tip &amp;#039;&amp;#039;&amp;#039;digitsum&amp;#039;&amp;#039;&amp;#039;. Fiecare bloc aduna cifrele de pe aceasi pozitie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Figura 1&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
   Top level&lt;br /&gt;
&lt;br /&gt;
[[Fișier: bcdsum.png]]&lt;br /&gt;
&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;digitsum&amp;#039;&amp;#039;&amp;#039; (Figura 2) este alcatuit din 4 blocuri, 2 sumatoare binare pe 4 biti (de tip &amp;#039;&amp;#039;&amp;#039;sum4&amp;#039;&amp;#039;&amp;#039;), o instanta de &amp;#039;&amp;#039;&amp;#039;cmp&amp;#039;&amp;#039;&amp;#039; si un multiplexor elementar mux2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Figura 2&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
   Blocul DIGIT SUM &lt;br /&gt;
&lt;br /&gt;
[[Fișier: digit.png]]&lt;br /&gt;
&lt;br /&gt;
Primul sumator aduna cifrele din domeniul [0...9] avand un rezultat intre [0 ... 18] &lt;br /&gt;
&lt;br /&gt;
Comparatorul are la iesire 1 daca rezultatul este mai mare decat 9.&lt;br /&gt;
&lt;br /&gt;
Daca rezultatul este mai mic decat 9, acesta este trimis in mod direct la iesirea &amp;#039;&amp;#039;&amp;#039;digit&amp;#039;&amp;#039;&amp;#039; a blocului &amp;#039;&amp;#039;&amp;#039;digitsum&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Daca rezultatul este mai mare decat 9, o crectie este necesara si se aduna 6 la rezultat.&lt;br /&gt;
&lt;br /&gt;
Comparatorul cu valoarea 9 este descris structural din porti in figura de mai jos: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Figure 3&amp;#039;&amp;#039;&amp;#039;   &lt;br /&gt;
   the comparator &lt;br /&gt;
&lt;br /&gt;
[[Fișier: cmp.png]]&lt;br /&gt;
&lt;br /&gt;
Testbench-ul va genera stimuli pentru &amp;#039;&amp;#039;&amp;#039;bcdsum&amp;#039;&amp;#039;&amp;#039; ca in Figura 4.&lt;br /&gt;
&lt;br /&gt;
Intrarea b0 a &amp;#039;&amp;#039;&amp;#039;bcdsum&amp;#039;&amp;#039;&amp;#039; se schimba la fiecare 5 pasi de simulare .&lt;br /&gt;
&lt;br /&gt;
b1, a0 si a1 se schimba sincron cu b0 ca in Figura 4.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Figure 4&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Fișier: teststimuli.png]]&lt;br /&gt;
&lt;br /&gt;
Cerinte:&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;cmp&amp;#039;&amp;#039;&amp;#039;- descris structural la nivel de porti ca in Figura 3.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;sum4&amp;#039;&amp;#039;&amp;#039; descris comportamental cu un assign continuu.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;mux&amp;#039;&amp;#039;&amp;#039; descris comportamental cu always.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;digitsum&amp;#039;&amp;#039;&amp;#039; descris strctural ca in Figura 2.&lt;br /&gt;
# modulul de top numit &amp;#039;&amp;#039;&amp;#039;bcdsum&amp;#039;&amp;#039;&amp;#039;, descris structural ca in Figure 1.&lt;br /&gt;
# modulul de testbench, &amp;#039;&amp;#039;&amp;#039;bcdsum_tb&amp;#039;&amp;#039;&amp;#039;, instantiaza &amp;#039;&amp;#039;&amp;#039;bcdsum&amp;#039;&amp;#039;&amp;#039; cu numele &amp;#039;&amp;#039;&amp;#039;dut&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# in testbench, generati stimuli pentru intrarile circuitului testat.&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 6: Codor Cezar===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/9/92/Cid_L1_codor_Cezar.pdf Codor_Cezar.pdf]&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 7: Calcul si Flag-uri===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/c/c2/L1_calcul_si_flaguri.pdf Calcul_si_flaguri.pdf]&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 8: Unitate aritmetico-logică (ALU)===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/8/85/Subiect_ALU_pentru_wiki.pdf Unitate_aritmetico-logica]&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_5_:_Exercitii_cu_circuite_combinationale&amp;diff=8128</id>
		<title>CID aplicatii 5 : Exercitii cu circuite combinationale</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_5_:_Exercitii_cu_circuite_combinationale&amp;diff=8128"/>
		<updated>2025-07-17T04:28:32Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Teorie==&lt;br /&gt;
&lt;br /&gt;
Acest laborator are rolul de a sedimenta cunostiintele dobandite anterior. &lt;br /&gt;
&lt;br /&gt;
El consta in exercitii separate, unele date ca subiect la lucrarea 1 in anii anteriori si cateva notiuni de teorie si sintaxa ajutatoare.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Teorie: Parametrizare==&lt;br /&gt;
Parametrizarea este un mod de a generaliza codul scris pentru a nu fi nevoie sa scrii acelasi modul de mai multe ori doar pentru ca circuitul isi schimba o dimensiune. &lt;br /&gt;
&lt;br /&gt;
Pentru a intelege mai clar avantajele si sintaxa urmariti urmatorul exemplu:&lt;br /&gt;
&lt;br /&gt;
Fisierul sumator.sv:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module sumator # // &amp;lt;= diez deoarece urmeaza lista cu paramteri&lt;br /&gt;
				( // parametri &lt;br /&gt;
					parameter data_size = 4 // valoare default 4&lt;br /&gt;
					// alti parametri aici daca este nevoie, separati prin virgula&lt;br /&gt;
				)&lt;br /&gt;
				( // interfata &lt;br /&gt;
					input logic [data_size-1:0] in0, // si pot folosii parametrul &amp;quot;data_size&amp;quot; pentru dimensiunea bus-ului&lt;br /&gt;
					input logic [data_size-1:0] in1,&lt;br /&gt;
					output logic [data_size-1:0] out0&lt;br /&gt;
				);&lt;br /&gt;
&lt;br /&gt;
assign out0 = in0 + in1;				&lt;br /&gt;
				&lt;br /&gt;
endmodule &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cand se instantiaza un modul parametrizat, se specifica valorile parametrilor astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
 sumator # ( // parametri &lt;br /&gt;
		.data_size(8)   // se genereaza un sumator pe 8b&lt;br /&gt;
	) &lt;br /&gt;
        nume_instanta_0&lt;br /&gt;
	( // interfata &lt;br /&gt;
		.in0(fir_in0), &lt;br /&gt;
		.in1(fir_in1),&lt;br /&gt;
		.out0(fir_out0)&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
 sumator # ( // parametri &lt;br /&gt;
		.data_size(32)  // se genereaza un sumator pe 32b&lt;br /&gt;
	) &lt;br /&gt;
        nume_instanta_1&lt;br /&gt;
	( // interfata &lt;br /&gt;
		.in0(fir_in0), &lt;br /&gt;
		.in1(fir_in1),&lt;br /&gt;
		.out0(fir_out1)&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
 sumator nume_instanta_2 // se genereaza un sumator de dimensiune default, aici 4, asa cum e scris in modulul &amp;quot;sumator&amp;quot;&lt;br /&gt;
	( // interfata &lt;br /&gt;
		.in0(fir_in0), &lt;br /&gt;
		.in1(fir_in1),&lt;br /&gt;
		.out0(fir_out2)&lt;br /&gt;
	);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Puteti folosi parametrizarea in exercitiul 3 de mai jos. Acolo sunt 2 tipuri de multiplexoare, unul cu intrarile pe 1 bit si unul cu intrarile pe 2 biti. Poate fi scris un singur modul parametrizat care sa acopere ambele situatii.&lt;br /&gt;
&lt;br /&gt;
==Teorie: Concatenarea==&lt;br /&gt;
&lt;br /&gt;
Pentru o mai usoara conectare a firelor sau pentru o mai buna organizare si expresivitate a codului, de multe ori este util ca fire individuale sa fie grupate impreuna sau ca un bus de mai multi biti sa fie separat in fire individuale. Acest lucru se face folosind concatenarea, prin simbolurile &amp;quot;{ }&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Un exemplu de folosire a concatenarii este oferit mai jos.&lt;br /&gt;
Un sumator pe 8b are rezultatul pe maxim 9b, in cazul in care ambele numere sunt mari. Astfel apare un bit de carry out. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module sumator ( &lt;br /&gt;
            input logic [7:0] in0,&lt;br /&gt;
            input logic [7:0] in1,&lt;br /&gt;
            output logic [7:0] out0,&lt;br /&gt;
            output logic carry_out&lt;br /&gt;
	);&lt;br /&gt;
&lt;br /&gt;
assign {carry_out,out0} = in0 + in1; // fac suma intre in0 si in1 iar rezultatul il pun pe cei 9b alcatuiti din: 1b carry_out si 8b out0, in ordinea asta&lt;br /&gt;
&lt;br /&gt;
endmodule       &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Se pot concatena oricat de multe semnale, puse in &amp;quot;{ }&amp;quot; si separate prin virgula. Atentie la dimensiunile firelor care se concateneaza.&lt;br /&gt;
&lt;br /&gt;
Se poate de asemenea face concatenare si la dreapta egalului, astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
assign fir_pe_10_b = {fir_pe_3b,fir_pe_5b,fir_pe_1b,fir_pe_1b};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
In exemplul anterior ultimi 2b ai &amp;quot;fir_pe_10_b&amp;quot; vor avea mereu aceeasi valoare, provenind din acelasi fir. Sintaxa SystemVerilog permite asta.&lt;br /&gt;
&lt;br /&gt;
Puteti folosii concatenarea, in exercitiul 2, la flag-ul de overflow.&lt;br /&gt;
&lt;br /&gt;
==Teorie: Constante ca intrari in circuite==&lt;br /&gt;
In cazul in care se doreste scrierea unor constante la intrarea unor module, acestea se pun direct intre paranteze la instantiere. &lt;br /&gt;
De exemplu, pentru multiplexorul de jos din subiectul &amp;quot;alu structural&amp;quot;, intrarea &amp;quot;in3&amp;quot; este conectata la valoarea &amp;quot;1&amp;quot;. Sintaxa pentru aceasta este: &amp;quot;.in3(1),&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Teorie: &amp;quot;_&amp;quot;==&lt;br /&gt;
Simbolul &amp;quot;_&amp;quot; (underscore) este ignorat de SystemVerilog si ajuta vizual la citirea semnalelor pe mai multi biti. De exemplu 16&amp;#039;b1010010111110000 este identic cu 16&amp;#039;b1010_0101_1111_0000, al doilea fiind totusi mai usor de citit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exercitii==&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 0: Repararea erorilor===&lt;br /&gt;
Arhiva de mai jos contine mai multe proiecte in Vivado, fiecare avand cate o eroare de sintaxa sau de logica. In vederea aprofundari cunostiintelor voastre (si pentru lucrarea de saptamana urmatoare), incercati sa le parcurgeti si sa rezolvati toate problemele. &lt;br /&gt;
Pe langa proiecte in sine, in arhiva se afla si un fisier text cu o introducere, rezolvarile si explicatiile pentru fiecare situatie.&lt;br /&gt;
&lt;br /&gt;
[https://drive.google.com/file/d/1cNTpQC54_JEeSk8SxgHTEdGtobCn_-EI/view?usp=drive_link Arhiva_proiecte_cu_erori.zip]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 1: ALU - descriere comportamentala===&lt;br /&gt;
Descrieți comportamental o unitate aritmetico-logică (ALU) care are la intrare 2 numere binare de câte 8 biți și poate calcula următoarele funcții:&lt;br /&gt;
:- suma celor două numere&lt;br /&gt;
:- diferența celor două numere&lt;br /&gt;
:- operații logice bit cu bit (bitwise): SI, SAU, XOR și inversele lor&lt;br /&gt;
:- operandul din stanga trece neschimbat&lt;br /&gt;
:- operandul din dreapta trece neschimbat&lt;br /&gt;
:- numărul din stânga este deplasat la stânga cu nr. de poziții indicat de numărul din dreapta&lt;br /&gt;
:- numărul din stânga este deplasat la dreapta cu nr. de poziții indicat de numărul din dreapta&lt;br /&gt;
&lt;br /&gt;
Funcția executată la un anumit moment este determinată de configurația binară de pe intrarea de comandă (function).&lt;br /&gt;
&lt;br /&gt;
ALU are de asemenea intrare de carry și ieșire de carry, plus alte două ieșiri - indicatori - pentru cazurile când rezultatul este zero și când cei doi operanzi sunt egali.&lt;br /&gt;
&lt;br /&gt;
Intrarea de control va fi facuta pe 4 biti ca sa permita existenta a 16 operatii posibile. Fiecare numar de pe intrarea de control (combinatie de 0 si 1) va reprezenta o operatie din cele de mai sus. Scrierea se va face folosind un bloc &amp;quot;case&amp;quot; in functie de aceasta intrare. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 2: ALU - descriere structurala===&lt;br /&gt;
 &lt;br /&gt;
[https://wiki.dcae.pub.ro/images/8/8f/Subiect_big_alu.pdf subiect_alu.pdf]&lt;br /&gt;
	&lt;br /&gt;
Daca se doreste selectarea doar a anumitor biti dintr-un bus (cum se vrea din instruction) acest lucru se poate face in 2 feluri:&lt;br /&gt;
&lt;br /&gt;
a) cu fir aditional:&lt;br /&gt;
:&amp;#039;&amp;#039;wire [1:0] fir_aditional1;&amp;#039;&amp;#039;&lt;br /&gt;
:&amp;#039;&amp;#039;assign fir_aditional1 = instruction[11:10];&amp;#039;&amp;#039;&lt;br /&gt;
:// apoi la instantiere: &amp;#039;&amp;#039;.sel(fir_aditional1),&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
b) direct in instantiere;&lt;br /&gt;
:la instantierea celor 2 mux4 din stanga, direct: &lt;br /&gt;
::&amp;#039;&amp;#039;.sel(instruction[11:10]),&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Pentru a scrie mai putin (a nu face toate modulele de calcul separat + instantierea lor) si pentru ca e vorba de operatii simple, se poate pune operatia cu assign direct in top pe un fir declarat acolo, sau si mai prescurtat, direct operatia dorita cand se intantiaza modulul in care aceasta intra. De exemplu, pentru operatia de shift la dreapta care intra in primul multiplexor, se poate pune:  &amp;quot;.in0(data0 &amp;gt;&amp;gt; data1),&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 3: Multiplexoare===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/3/3a/Subiect_muxes.pdf subiect_muxes.pdf]&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 4: Rom/Look-up table===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/2/2e/Subiect_rom_luts.pdf rom_luts.pdf]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 5: Sumator cu reprezentare in cifre zecimale===&lt;br /&gt;
Proiectati si verificati un sumator zecimal pentru numere cu 2 cifre&lt;br /&gt;
&lt;br /&gt;
Modulul de top (Figura 1) este alcatuit din 2 blocuri de tip &amp;#039;&amp;#039;&amp;#039;digitsum&amp;#039;&amp;#039;&amp;#039;. Fiecare bloc aduna cifrele de pe aceasi pozitie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Figura 1&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
   Top level&lt;br /&gt;
&lt;br /&gt;
[[Fișier: bcdsum.png]]&lt;br /&gt;
&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;digitsum&amp;#039;&amp;#039;&amp;#039; (Figura 2) este alcatuit din 4 blocuri, 2 sumatoare binare pe 4 biti (de tip &amp;#039;&amp;#039;&amp;#039;sum4&amp;#039;&amp;#039;&amp;#039;), o instanta de &amp;#039;&amp;#039;&amp;#039;cmp&amp;#039;&amp;#039;&amp;#039; si un multiplexor elementar mux2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Figura 2&amp;#039;&amp;#039;&amp;#039;  &lt;br /&gt;
   Blocul DIGIT SUM &lt;br /&gt;
&lt;br /&gt;
[[Fișier: digit.png]]&lt;br /&gt;
&lt;br /&gt;
Primul sumator aduna cifrele din domeniul [0...9] avand un rezultat intre [0 ... 18] &lt;br /&gt;
&lt;br /&gt;
Comparatorul are la iesire 1 daca rezultatul este mai mare decat 9.&lt;br /&gt;
&lt;br /&gt;
Daca rezultatul este mai mic decat 9, acesta este trimis in mod direct la iesirea &amp;#039;&amp;#039;&amp;#039;digit&amp;#039;&amp;#039;&amp;#039; a blocului &amp;#039;&amp;#039;&amp;#039;digitsum&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Daca rezultatul este mai mare decat 9, o crectie este necesara si se aduna 6 la rezultat.&lt;br /&gt;
&lt;br /&gt;
Comparatorul cu valoarea 9 este descris structural din porti in figura de mai jos: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Figure 3&amp;#039;&amp;#039;&amp;#039;   &lt;br /&gt;
   the comparator &lt;br /&gt;
&lt;br /&gt;
[[Fișier: cmp.png]]&lt;br /&gt;
&lt;br /&gt;
Testbench-ul va genera stimuli pentru &amp;#039;&amp;#039;&amp;#039;bcdsum&amp;#039;&amp;#039;&amp;#039; ca in Figura 4.&lt;br /&gt;
&lt;br /&gt;
Intrarea b0 a &amp;#039;&amp;#039;&amp;#039;bcdsum&amp;#039;&amp;#039;&amp;#039; se schimba la fiecare 5 pasi de simulare .&lt;br /&gt;
&lt;br /&gt;
b1, a0 si a1 se schimba sincron cu b0 ca in Figura 4.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Figure 4&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Fișier: teststimuli.png]]&lt;br /&gt;
&lt;br /&gt;
Cerinte:&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;cmp&amp;#039;&amp;#039;&amp;#039;- descris structural la nivel de porti ca in Figura 3.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;sum4&amp;#039;&amp;#039;&amp;#039; descris comportamental cu un assign continuu.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;mux&amp;#039;&amp;#039;&amp;#039; descris comportamental cu always.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;digitsum&amp;#039;&amp;#039;&amp;#039; descris strctural ca in Figura 2.&lt;br /&gt;
# modulul de top numit &amp;#039;&amp;#039;&amp;#039;bcdsum&amp;#039;&amp;#039;&amp;#039;, descris structural ca in Figure 1.&lt;br /&gt;
# modulul de testbench, &amp;#039;&amp;#039;&amp;#039;bcdsum_tb&amp;#039;&amp;#039;&amp;#039;, instantiaza &amp;#039;&amp;#039;&amp;#039;bcdsum&amp;#039;&amp;#039;&amp;#039; cu numele &amp;#039;&amp;#039;&amp;#039;dut&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
# in testbench, generati stimuli pentru intrarile circuitului testat.&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 6: Codor Cezar===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/9/92/Cid_L1_codor_Cezar.pdf Codor_Cezar.pdf]&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 7: Calcul si Flag-uri===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/c/c2/L1_calcul_si_flaguri.pdf Calcul_si_flaguri.pdf]&lt;br /&gt;
&lt;br /&gt;
===Exercitiul 8: Unitate aritmetico-logică (ALU)===&lt;br /&gt;
&lt;br /&gt;
[https://wiki.dcae.pub.ro/images/8/85/Subiect_ALU_pentru_wiki.pdf]&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Subiect_ALU_pentru_wiki.pdf&amp;diff=8127</id>
		<title>Fișier:Subiect ALU pentru wiki.pdf</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Subiect_ALU_pentru_wiki.pdf&amp;diff=8127"/>
		<updated>2025-07-17T04:27:36Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_4_:_Memoria_ROM&amp;diff=7997</id>
		<title>CID aplicatii 4 : Memoria ROM</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_4_:_Memoria_ROM&amp;diff=7997"/>
		<updated>2025-03-11T09:25:36Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Exemplul 2: Transcodorul */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Memoria ROM==&lt;br /&gt;
Memoria este un dispozitiv electronic utilizat pentru stocarea datelor. Aceasta poate fi de mai multe feluri, având diverse caracteristici, cum ar fi capacitatea de a-și păstra sau nu conținutul după întreruperea alimentării sau capacitatea de a-și modifica sau nu conținutul după terminarea procesului de producție. &lt;br /&gt;
&lt;br /&gt;
Memoria  ROM (Read-Only  Memory) este un circuit combinațional folosit pentru stocarea unor date ce pot fi accesate cu ajutorul unei intrări de adresă. Asa cum sugerează și numele, memoria ROM clasică nu poate fi modificată. În plus, datorită modului în care este implementată, ea își păstrează conținutul după întreruperea alimentării (este nevolatilă).  &lt;br /&gt;
&lt;br /&gt;
Pentru a înțelege termenul de memorie, putem face următorul exercițiu de imaginație: să ne gândim la un dulap cu mai multe sertare. Conținutul memoriei este reprezentat de conținutul sertarelor, iar adresele sunt reprezentate de etichetele lipite pe aceste sertare pentru a le identifica. Dacă avem nevoie de conținutul unui sertar, va trebui să știm eticheta aferentă acestuia (adresa).&lt;br /&gt;
&lt;br /&gt;
O memorie ROM are următorii parametri: numărul de biți ai adresei, care este legat de numarul de locații de memorie (cu n biți de adresă putem forma 2&amp;lt;sup&amp;gt;𝑛&amp;lt;/sup&amp;gt; combinații diferite, deci putem accesa maxim 2&amp;lt;sup&amp;gt;𝑛&amp;lt;/sup&amp;gt; locații de memorie) și dimensiunea locației de memorie, care ne spune cât de multă informație poate stoca o locație de memorie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Să urmărim exemplul din figura următoare:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:ROM memory.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aici, adresa are dimensiunea de 4 biți, asadar putem accesa cu aceasta 16 locații diferite de memorie. Dimensiunea fiecărei locații este de 8 biți, așadar fiecare locație de memorie poate stoca numere de 8 biți. Spunem că memoria ROM este o memorie 16x8.  Capacitatea acestei memorii este de 16 x 8 biți = 128 biți.&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
&lt;br /&gt;
Următoarele circuite pot fi văzute în 2 moduri: ca memorii de tip ROM, cu date de ieșire care depind de adresa (data de intrare) de la care citești cât și ca circuite combinationale a căror ieșire este generată prin porți din intrare.&lt;br /&gt;
&lt;br /&gt;
=== Exemplul 1: Decodorul ===&lt;br /&gt;
Decodorul este circuitul care, pentru o anumită valoare a intrării, va genera la ieșire un șir binar care conține 1 pe poziția cu indicele egal cu valorea intrării și 0 in rest. De exemplu, decodorul de mai jos pe 2 biți va avea următoarea corespondență intrare-iesire:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;in&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;out&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2&amp;#039;b00 || 4&amp;#039;b0001&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b01 || 4&amp;#039;b0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b10 || 4&amp;#039;b0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b11 || 4&amp;#039;b1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Decoder.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
Vom implementa acest circuit ca memorie ROM. &amp;quot;in&amp;quot; are rolul de adresa iar out are rolul de date de la adresa respectiva. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Decoder(&lt;br /&gt;
  input logic [1:0] in,&lt;br /&gt;
  output logic [3:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always_comb begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      2&amp;#039;b00: out = 4&amp;#039;b0001; //la adresa 0 avem valoarea 1&lt;br /&gt;
      2&amp;#039;b01: out = 4&amp;#039;b0010; //la adresa 1 avem valoarea 2&lt;br /&gt;
      2&amp;#039;b10: out = 4&amp;#039;b0100; //la adresa 2 avem valoarea 4&lt;br /&gt;
      2&amp;#039;b11: out = 4&amp;#039;b1000; //la adresa 3 avem valoarea 8&lt;br /&gt;
      default: out = 4&amp;#039;b0000;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module Decoder_TB();&lt;br /&gt;
  logic [1:0] in_tb;&lt;br /&gt;
  logic [3:0] out_tb;&lt;br /&gt;
  &lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;4; idx = idx + 1) begin&lt;br /&gt;
      in_t = idx;&lt;br /&gt;
      #1;&lt;br /&gt;
    end &lt;br /&gt;
    #2 $stop();&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  Decoder DUT(&lt;br /&gt;
    .in(in_tb),&lt;br /&gt;
    .out(out_tb)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Circuitul Decoder va avea o intrare pe 2  biți, care va reprezenta adresa memoriei ROM și o iesire pe 4 biți, reprezentând conținuturile memoriei ROM corespunzătoare fiecărei combinații de la intrare.&lt;br /&gt;
* Chiar dacă în interiorul instrucțiunii &amp;#039;&amp;#039;case&amp;#039;&amp;#039; se acoperă toate cazurile posibile (toate combinațiile de 2 biți), este bine sa punem și un &amp;#039;&amp;#039;default&amp;#039;&amp;#039; pentru a evita inserarea în locul circuitului combinațional dorit (aici, memoria ROM) a unui latch.&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2: Transcodorul===&lt;br /&gt;
Trancodorul este o memorie ROM care asociază unui anumit cod de intrare, reprezentat de adresă, un anumit cod de ieșire, reprezentat de conținutului locației de memorie asociată acelei adrese.&lt;br /&gt;
&lt;br /&gt;
In acest exemplu, vom folosi transcodorul pentru a realiza un modul ce controlează afișajul cu 7 segmente. Acest dispozitiv de afișare este format, așa cum sugerează și numele, din 7 segmente ce pot fi controlate separat. Putem aprinde sau stinge fiecare segment controlând tensiunea aplicată pe acesta. Pentru acest afișaj, comanda este în logică negativă: aplicând  0  logic pe un segment acesta se va aprinde, iar aplicând 1 logic, acesta se va stinge.&lt;br /&gt;
&lt;br /&gt;
Structura unui afisaj cu 7 segmente este prezentată în imaginea de mai jos:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:7LED display.PNG | 200px]]&lt;br /&gt;
&lt;br /&gt;
Pentru a realiza controlul afișării, avem nevoie de o memorie ROM ce trebuie să asocieze codului binar al fiecărui element ce poate fi afișat un șir de biți care sting sau aprind diversele segmente ale afișajului, astfel încât să apară imaginea elementului dorit.&lt;br /&gt;
&lt;br /&gt;
Pentru a reprezenta, de exemplu, cele 16 numere hexa, segmentele  trebuie  aprinse  conform Anexei 1. De exemplu, pentru primele 8 numere (0 până la 7), tabelul de asociere este următorul:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Număr&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Cod intrare&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Șir de afisare&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 0 || 4&amp;#039;b0000 || 7&amp;#039;b100_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 1 || 4&amp;#039;b0001 || 7&amp;#039;b111_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2 || 4&amp;#039;b0010 || 7&amp;#039;b010_0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 3 || 4&amp;#039;b0011 || 7&amp;#039;b011_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 4 || 4&amp;#039;b0100 || 7&amp;#039;b001_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 5 || 4&amp;#039;b0101 || 7&amp;#039;b001_0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 6 || 4&amp;#039;b0110 || 7&amp;#039;b000_0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 7 || 4&amp;#039;b0111 || 7&amp;#039;b111_1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a modulului Display7Seg&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Display7Seg(&lt;br /&gt;
  input logic [3:0] in,&lt;br /&gt;
  output logic [6:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always_comb begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      4&amp;#039;d0: out = 7&amp;#039;b1000000;&lt;br /&gt;
      4&amp;#039;d1: out = 7&amp;#039;b1111001;&lt;br /&gt;
      4&amp;#039;d2: out = 7&amp;#039;b0100100;&lt;br /&gt;
      4&amp;#039;d3: out = 7&amp;#039;b0110000;&lt;br /&gt;
      4&amp;#039;d4: out = 7&amp;#039;b0011001;&lt;br /&gt;
      4&amp;#039;d5: out = 7&amp;#039;b0010010;&lt;br /&gt;
      4&amp;#039;d6: out = 7&amp;#039;b0000010;&lt;br /&gt;
      4&amp;#039;d7: out = 7&amp;#039;b1111000;&lt;br /&gt;
      default: out = 7&amp;#039;b0000110;&lt;br /&gt;
    endcase &lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții:==&lt;br /&gt;
=== Exercițiul 1===&lt;br /&gt;
Completați codul din Exemplul 2 astfel încât să se poată reprezenta toate numerele în bază 16 (hexazecimal), conform Anexei 1&lt;br /&gt;
&lt;br /&gt;
=== Exercițiul 2===&lt;br /&gt;
Un procesor are nevoie de un șir de biți numit instrucțiune pentru a știi ce trebuie să facă. Această instrucțiune codează în șirul său de biți toate informațiile necesare. &lt;br /&gt;
&lt;br /&gt;
De exemplu, pentru un grup de instrucțiuni care operează cu registre, aceste informații pot fi:&lt;br /&gt;
* codul instrucțiunii (operation code - opcode): un șir de biți care ne spune ce operație se execută.&lt;br /&gt;
* destinația: un șir de biți care codează numărul registrului destinație.&lt;br /&gt;
* sursa1: un șir de biți care codează numărul registrului folosit ca operand 1.&lt;br /&gt;
* sursa2: un șir de biți care codează numărul registrului folosit ca operand 2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vom considera codul operației pe 4 biți, ceea ce inseamnă ca putem avea 16 instrucțiuni diferite. In plus, câmpurile care codează destinația și cei doi operanzi vor avea fiecare câte 4 biți, ceea ce inseamnă că vom avea 16 registre cu care putem lucra (R0 ... R15). Adunând dimensiunile fiecărui câmp, vom obține o instrucțiune pe 16 biți.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Instrucțiunile și codul operațiilor:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Vom considera ca procesorul nostru elementar poate suporta următoarele instrucțiuni:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Cod operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Sintaxă&amp;#039;&amp;#039;&amp;#039; ||&amp;#039;&amp;#039;&amp;#039;Descriere&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| ADD || 4&amp;#039;b0000 || ADD Rd Rs1 Rs2 || Rd = Rs1 + Rs2 &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| SUB || 4&amp;#039;b0001 || SUB Rd Rs1 Rs2 || Rd = Rs1 - Rs2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| OR || 4&amp;#039;b0010 || OR Rd Rs1 Rs2 || Rd = Rs1 OR Rs2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| AND || 4&amp;#039;b0011 || AND Rd Rs1 Rs2 || Rd = Rs1 AND Rs2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| LOADC || 4&amp;#039;b0100 || LOADC Rd, const || Rd = const&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pentru instrucțiunile prezentate mai sus, vom avea următoarele moduri de codare (de împărțire a informației în cadrul instrucțiunii):&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Codare instructiune.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Registrele:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Cele 16 registre vor fi codate cu un număr egal cu indexul său. De exemplu, R0 va avea codul 4&amp;#039;b000, R1 va avea codul 4&amp;#039;b0001 și așa mai departe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Considerând cele spuse mai sus, vom avea următoarele exemple de instrucțiuni:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Exemple codare instructiuni.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Având toate informațiile de mai sus, descrieți o memorie ROM cu adresă pe 4 biți și locații pe 16 biți, care să conțină următorul program, începând cu adresa 0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LOADC R0, 2h&lt;br /&gt;
LOADC R1, 5h&lt;br /&gt;
LOADC R2, 7h&lt;br /&gt;
ADD R3, R1, R0&lt;br /&gt;
SUB R4, R2, R1&lt;br /&gt;
OR R5, R3, R4&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercițiul 3===&lt;br /&gt;
Proiectați un Codor Cezar cu cheie fixă sub forma unei memorii ROM. &lt;br /&gt;
&lt;br /&gt;
Un Codor Cezar preia un mesaj și codează independent fiecare literă a acestuia pentru a obține un mesaj cifrat. El se folosește de o cheie fixă care se adună la fiecare literă a mesajului. De exemplu, pentru cheia &amp;quot;+3&amp;quot;: a-&amp;gt;d; b-&amp;gt;e; c-&amp;gt;f;...; y-&amp;gt;b; z-&amp;gt;c. Observați că atunci când alfabetul a ajuns la capăt, se reia de la început. &lt;br /&gt;
Pentru decodare, se va folosi procedura inversă: pentru fiecare literă, vom aplica cheia cu semn invers (în exemplul nostru, cheia de decodare este &amp;quot;-3&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
Observații, sfaturi, task-uri suplimentare:&lt;br /&gt;
* Codorul va putea prelucra doar litere mici și spațiu gol (acesta rămâne neschimbat).&lt;br /&gt;
* Cel mai usor mod de a scrie această funcționalitate este folosind un bloc de tip &amp;#039;&amp;#039;case&amp;#039;&amp;#039;.&lt;br /&gt;
* Pentru testare, se pot folosi în testbench variabile de tip &amp;#039;&amp;#039;logic&amp;#039;&amp;#039; pe 8 biți, astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [7:0] litera;&lt;br /&gt;
litera = &amp;quot;A&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Avansat: În SystemVerilog există și tipul de date &amp;#039;&amp;#039;string&amp;#039;&amp;#039;, ceea ce permite parcurgerea cu un &amp;#039;&amp;#039;for&amp;#039;&amp;#039; a mesajului. În Verilog clasic, astfel de parcurgeri sunt posibile, dar sintaxa este mai complicată.&lt;br /&gt;
* Se va folosi codul ASCII pentru valori. Pentru o ușoara vizualizare a datelor în simulare, se poate schimba radix-ul în ASCII. &lt;br /&gt;
* Avansat: Pentru a testa automat codul, se poate instanția încă un modul în testbench cu aceeași funcționalitate pe post de &amp;quot;golden model&amp;quot;. Acest modul nu trebuie să fie sintetizabil și atunci sintaxa permite mai multă libertate (cum ar fi operația de modulo &amp;quot;%&amp;quot;, utilă pentru testare, dar care determină un circuit complicat dacă ar fi sintetizată). Ieșirile celor două module din testbench sunt apoi comparate pentru a se verifica că ambele implementări oferă același rezultat.&lt;br /&gt;
* Implementați și Decodorul Cezar și testați Codorul împreună cu acesta. Aveți grijă ca cele două module să aibă aceeași cheie.&lt;br /&gt;
&lt;br /&gt;
==Anexa1== &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Anexa1.PNG | 800px]]&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_4_:_Memoria_ROM&amp;diff=7996</id>
		<title>CID aplicatii 4 : Memoria ROM</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_4_:_Memoria_ROM&amp;diff=7996"/>
		<updated>2025-03-11T09:24:49Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Exemplul 2: Transcodorul */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Memoria ROM==&lt;br /&gt;
Memoria este un dispozitiv electronic utilizat pentru stocarea datelor. Aceasta poate fi de mai multe feluri, având diverse caracteristici, cum ar fi capacitatea de a-și păstra sau nu conținutul după întreruperea alimentării sau capacitatea de a-și modifica sau nu conținutul după terminarea procesului de producție. &lt;br /&gt;
&lt;br /&gt;
Memoria  ROM (Read-Only  Memory) este un circuit combinațional folosit pentru stocarea unor date ce pot fi accesate cu ajutorul unei intrări de adresă. Asa cum sugerează și numele, memoria ROM clasică nu poate fi modificată. În plus, datorită modului în care este implementată, ea își păstrează conținutul după întreruperea alimentării (este nevolatilă).  &lt;br /&gt;
&lt;br /&gt;
Pentru a înțelege termenul de memorie, putem face următorul exercițiu de imaginație: să ne gândim la un dulap cu mai multe sertare. Conținutul memoriei este reprezentat de conținutul sertarelor, iar adresele sunt reprezentate de etichetele lipite pe aceste sertare pentru a le identifica. Dacă avem nevoie de conținutul unui sertar, va trebui să știm eticheta aferentă acestuia (adresa).&lt;br /&gt;
&lt;br /&gt;
O memorie ROM are următorii parametri: numărul de biți ai adresei, care este legat de numarul de locații de memorie (cu n biți de adresă putem forma 2&amp;lt;sup&amp;gt;𝑛&amp;lt;/sup&amp;gt; combinații diferite, deci putem accesa maxim 2&amp;lt;sup&amp;gt;𝑛&amp;lt;/sup&amp;gt; locații de memorie) și dimensiunea locației de memorie, care ne spune cât de multă informație poate stoca o locație de memorie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Să urmărim exemplul din figura următoare:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:ROM memory.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aici, adresa are dimensiunea de 4 biți, asadar putem accesa cu aceasta 16 locații diferite de memorie. Dimensiunea fiecărei locații este de 8 biți, așadar fiecare locație de memorie poate stoca numere de 8 biți. Spunem că memoria ROM este o memorie 16x8.  Capacitatea acestei memorii este de 16 x 8 biți = 128 biți.&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
&lt;br /&gt;
Următoarele circuite pot fi văzute în 2 moduri: ca memorii de tip ROM, cu date de ieșire care depind de adresa (data de intrare) de la care citești cât și ca circuite combinationale a căror ieșire este generată prin porți din intrare.&lt;br /&gt;
&lt;br /&gt;
=== Exemplul 1: Decodorul ===&lt;br /&gt;
Decodorul este circuitul care, pentru o anumită valoare a intrării, va genera la ieșire un șir binar care conține 1 pe poziția cu indicele egal cu valorea intrării și 0 in rest. De exemplu, decodorul de mai jos pe 2 biți va avea următoarea corespondență intrare-iesire:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;in&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;out&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2&amp;#039;b00 || 4&amp;#039;b0001&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b01 || 4&amp;#039;b0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b10 || 4&amp;#039;b0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b11 || 4&amp;#039;b1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Decoder.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
Vom implementa acest circuit ca memorie ROM. &amp;quot;in&amp;quot; are rolul de adresa iar out are rolul de date de la adresa respectiva. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Decoder(&lt;br /&gt;
  input logic [1:0] in,&lt;br /&gt;
  output logic [3:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always_comb begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      2&amp;#039;b00: out = 4&amp;#039;b0001; //la adresa 0 avem valoarea 1&lt;br /&gt;
      2&amp;#039;b01: out = 4&amp;#039;b0010; //la adresa 1 avem valoarea 2&lt;br /&gt;
      2&amp;#039;b10: out = 4&amp;#039;b0100; //la adresa 2 avem valoarea 4&lt;br /&gt;
      2&amp;#039;b11: out = 4&amp;#039;b1000; //la adresa 3 avem valoarea 8&lt;br /&gt;
      default: out = 4&amp;#039;b0000;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module Decoder_TB();&lt;br /&gt;
  logic [1:0] in_tb;&lt;br /&gt;
  logic [3:0] out_tb;&lt;br /&gt;
  &lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;4; idx = idx + 1) begin&lt;br /&gt;
      in_t = idx;&lt;br /&gt;
      #1;&lt;br /&gt;
    end &lt;br /&gt;
    #2 $stop();&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  Decoder DUT(&lt;br /&gt;
    .in(in_tb),&lt;br /&gt;
    .out(out_tb)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Circuitul Decoder va avea o intrare pe 2  biți, care va reprezenta adresa memoriei ROM și o iesire pe 4 biți, reprezentând conținuturile memoriei ROM corespunzătoare fiecărei combinații de la intrare.&lt;br /&gt;
* Chiar dacă în interiorul instrucțiunii &amp;#039;&amp;#039;case&amp;#039;&amp;#039; se acoperă toate cazurile posibile (toate combinațiile de 2 biți), este bine sa punem și un &amp;#039;&amp;#039;default&amp;#039;&amp;#039; pentru a evita inserarea în locul circuitului combinațional dorit (aici, memoria ROM) a unui latch.&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2: Transcodorul===&lt;br /&gt;
Trancodorul este o memorie ROM care asociază unui anumit cod de intrare, reprezentat de adresă, un anumit cod de ieșire, reprezentat de conținutului locației de memorie asociată acelei adrese.&lt;br /&gt;
&lt;br /&gt;
In acest exemplu, vom folosi transcodorul pentru a realiza un modul ce controlează afișajul cu 7 segmente. Acest dispozitiv de afișare este format, așa cum sugerează și numele, din 7 segmente ce pot fi controlate separat. Putem aprinde sau stinge fiecare segment controlând tensiunea aplicată pe acesta. Pentru acest afișaj, comanda este negativă: aplicând  0  logic pe un segment acesta se va aprinde, iar aplicând 1 logic, acesta se va stinge.&lt;br /&gt;
&lt;br /&gt;
Structura unui afisaj cu 7 segmente este prezentată în imaginea de mai jos:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:7LED display.PNG | 200px]]&lt;br /&gt;
&lt;br /&gt;
Pentru a realiza controlul afișării, avem nevoie de o memorie ROM ce trebuie să asocieze codului binar al fiecărui element ce poate fi afișat un șir de biți care sting sau aprind diversele segmente ale afișajului, astfel încât să apară imaginea elementului dorit.&lt;br /&gt;
&lt;br /&gt;
Pentru a reprezenta, de exemplu, cele 16 numere hexa, segmentele  trebuie  aprinse  conform Anexei 1. De exemplu, pentru primele 8 numere (0 până la 7), tabelul de asociere este următorul:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Număr&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Cod intrare&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Șir de afisare&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 0 || 4&amp;#039;b0000 || 7&amp;#039;b100_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 1 || 4&amp;#039;b0001 || 7&amp;#039;b111_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2 || 4&amp;#039;b0010 || 7&amp;#039;b010_0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 3 || 4&amp;#039;b0011 || 7&amp;#039;b011_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 4 || 4&amp;#039;b0100 || 7&amp;#039;b001_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 5 || 4&amp;#039;b0101 || 7&amp;#039;b001_0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 6 || 4&amp;#039;b0110 || 7&amp;#039;b000_0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 7 || 4&amp;#039;b0111 || 7&amp;#039;b111_1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a modulului Display7Seg&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Display7Seg(&lt;br /&gt;
  input logic [3:0] in,&lt;br /&gt;
  output logic [6:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always_comb begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      4&amp;#039;d0: out = 7&amp;#039;b1000000;&lt;br /&gt;
      4&amp;#039;d1: out = 7&amp;#039;b1111001;&lt;br /&gt;
      4&amp;#039;d2: out = 7&amp;#039;b0100100;&lt;br /&gt;
      4&amp;#039;d3: out = 7&amp;#039;b0110000;&lt;br /&gt;
      4&amp;#039;d4: out = 7&amp;#039;b0011001;&lt;br /&gt;
      4&amp;#039;d5: out = 7&amp;#039;b0010010;&lt;br /&gt;
      4&amp;#039;d6: out = 7&amp;#039;b0000010;&lt;br /&gt;
      4&amp;#039;d7: out = 7&amp;#039;b1111000;&lt;br /&gt;
      default: out = 7&amp;#039;b0000110;&lt;br /&gt;
    endcase &lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții:==&lt;br /&gt;
=== Exercițiul 1===&lt;br /&gt;
Completați codul din Exemplul 2 astfel încât să se poată reprezenta toate numerele în bază 16 (hexazecimal), conform Anexei 1&lt;br /&gt;
&lt;br /&gt;
=== Exercițiul 2===&lt;br /&gt;
Un procesor are nevoie de un șir de biți numit instrucțiune pentru a știi ce trebuie să facă. Această instrucțiune codează în șirul său de biți toate informațiile necesare. &lt;br /&gt;
&lt;br /&gt;
De exemplu, pentru un grup de instrucțiuni care operează cu registre, aceste informații pot fi:&lt;br /&gt;
* codul instrucțiunii (operation code - opcode): un șir de biți care ne spune ce operație se execută.&lt;br /&gt;
* destinația: un șir de biți care codează numărul registrului destinație.&lt;br /&gt;
* sursa1: un șir de biți care codează numărul registrului folosit ca operand 1.&lt;br /&gt;
* sursa2: un șir de biți care codează numărul registrului folosit ca operand 2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vom considera codul operației pe 4 biți, ceea ce inseamnă ca putem avea 16 instrucțiuni diferite. In plus, câmpurile care codează destinația și cei doi operanzi vor avea fiecare câte 4 biți, ceea ce inseamnă că vom avea 16 registre cu care putem lucra (R0 ... R15). Adunând dimensiunile fiecărui câmp, vom obține o instrucțiune pe 16 biți.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Instrucțiunile și codul operațiilor:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Vom considera ca procesorul nostru elementar poate suporta următoarele instrucțiuni:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Cod operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Sintaxă&amp;#039;&amp;#039;&amp;#039; ||&amp;#039;&amp;#039;&amp;#039;Descriere&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| ADD || 4&amp;#039;b0000 || ADD Rd Rs1 Rs2 || Rd = Rs1 + Rs2 &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| SUB || 4&amp;#039;b0001 || SUB Rd Rs1 Rs2 || Rd = Rs1 - Rs2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| OR || 4&amp;#039;b0010 || OR Rd Rs1 Rs2 || Rd = Rs1 OR Rs2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| AND || 4&amp;#039;b0011 || AND Rd Rs1 Rs2 || Rd = Rs1 AND Rs2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| LOADC || 4&amp;#039;b0100 || LOADC Rd, const || Rd = const&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pentru instrucțiunile prezentate mai sus, vom avea următoarele moduri de codare (de împărțire a informației în cadrul instrucțiunii):&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Codare instructiune.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Registrele:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Cele 16 registre vor fi codate cu un număr egal cu indexul său. De exemplu, R0 va avea codul 4&amp;#039;b000, R1 va avea codul 4&amp;#039;b0001 și așa mai departe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Considerând cele spuse mai sus, vom avea următoarele exemple de instrucțiuni:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Exemple codare instructiuni.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Având toate informațiile de mai sus, descrieți o memorie ROM cu adresă pe 4 biți și locații pe 16 biți, care să conțină următorul program, începând cu adresa 0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LOADC R0, 2h&lt;br /&gt;
LOADC R1, 5h&lt;br /&gt;
LOADC R2, 7h&lt;br /&gt;
ADD R3, R1, R0&lt;br /&gt;
SUB R4, R2, R1&lt;br /&gt;
OR R5, R3, R4&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercițiul 3===&lt;br /&gt;
Proiectați un Codor Cezar cu cheie fixă sub forma unei memorii ROM. &lt;br /&gt;
&lt;br /&gt;
Un Codor Cezar preia un mesaj și codează independent fiecare literă a acestuia pentru a obține un mesaj cifrat. El se folosește de o cheie fixă care se adună la fiecare literă a mesajului. De exemplu, pentru cheia &amp;quot;+3&amp;quot;: a-&amp;gt;d; b-&amp;gt;e; c-&amp;gt;f;...; y-&amp;gt;b; z-&amp;gt;c. Observați că atunci când alfabetul a ajuns la capăt, se reia de la început. &lt;br /&gt;
Pentru decodare, se va folosi procedura inversă: pentru fiecare literă, vom aplica cheia cu semn invers (în exemplul nostru, cheia de decodare este &amp;quot;-3&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
Observații, sfaturi, task-uri suplimentare:&lt;br /&gt;
* Codorul va putea prelucra doar litere mici și spațiu gol (acesta rămâne neschimbat).&lt;br /&gt;
* Cel mai usor mod de a scrie această funcționalitate este folosind un bloc de tip &amp;#039;&amp;#039;case&amp;#039;&amp;#039;.&lt;br /&gt;
* Pentru testare, se pot folosi în testbench variabile de tip &amp;#039;&amp;#039;logic&amp;#039;&amp;#039; pe 8 biți, astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [7:0] litera;&lt;br /&gt;
litera = &amp;quot;A&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Avansat: În SystemVerilog există și tipul de date &amp;#039;&amp;#039;string&amp;#039;&amp;#039;, ceea ce permite parcurgerea cu un &amp;#039;&amp;#039;for&amp;#039;&amp;#039; a mesajului. În Verilog clasic, astfel de parcurgeri sunt posibile, dar sintaxa este mai complicată.&lt;br /&gt;
* Se va folosi codul ASCII pentru valori. Pentru o ușoara vizualizare a datelor în simulare, se poate schimba radix-ul în ASCII. &lt;br /&gt;
* Avansat: Pentru a testa automat codul, se poate instanția încă un modul în testbench cu aceeași funcționalitate pe post de &amp;quot;golden model&amp;quot;. Acest modul nu trebuie să fie sintetizabil și atunci sintaxa permite mai multă libertate (cum ar fi operația de modulo &amp;quot;%&amp;quot;, utilă pentru testare, dar care determină un circuit complicat dacă ar fi sintetizată). Ieșirile celor două module din testbench sunt apoi comparate pentru a se verifica că ambele implementări oferă același rezultat.&lt;br /&gt;
* Implementați și Decodorul Cezar și testați Codorul împreună cu acesta. Aveți grijă ca cele două module să aibă aceeași cheie.&lt;br /&gt;
&lt;br /&gt;
==Anexa1== &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Anexa1.PNG | 800px]]&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_4_:_Memoria_ROM&amp;diff=7995</id>
		<title>CID aplicatii 4 : Memoria ROM</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_4_:_Memoria_ROM&amp;diff=7995"/>
		<updated>2025-03-11T09:22:50Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Exemplul 1: Decodorul */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Memoria ROM==&lt;br /&gt;
Memoria este un dispozitiv electronic utilizat pentru stocarea datelor. Aceasta poate fi de mai multe feluri, având diverse caracteristici, cum ar fi capacitatea de a-și păstra sau nu conținutul după întreruperea alimentării sau capacitatea de a-și modifica sau nu conținutul după terminarea procesului de producție. &lt;br /&gt;
&lt;br /&gt;
Memoria  ROM (Read-Only  Memory) este un circuit combinațional folosit pentru stocarea unor date ce pot fi accesate cu ajutorul unei intrări de adresă. Asa cum sugerează și numele, memoria ROM clasică nu poate fi modificată. În plus, datorită modului în care este implementată, ea își păstrează conținutul după întreruperea alimentării (este nevolatilă).  &lt;br /&gt;
&lt;br /&gt;
Pentru a înțelege termenul de memorie, putem face următorul exercițiu de imaginație: să ne gândim la un dulap cu mai multe sertare. Conținutul memoriei este reprezentat de conținutul sertarelor, iar adresele sunt reprezentate de etichetele lipite pe aceste sertare pentru a le identifica. Dacă avem nevoie de conținutul unui sertar, va trebui să știm eticheta aferentă acestuia (adresa).&lt;br /&gt;
&lt;br /&gt;
O memorie ROM are următorii parametri: numărul de biți ai adresei, care este legat de numarul de locații de memorie (cu n biți de adresă putem forma 2&amp;lt;sup&amp;gt;𝑛&amp;lt;/sup&amp;gt; combinații diferite, deci putem accesa maxim 2&amp;lt;sup&amp;gt;𝑛&amp;lt;/sup&amp;gt; locații de memorie) și dimensiunea locației de memorie, care ne spune cât de multă informație poate stoca o locație de memorie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Să urmărim exemplul din figura următoare:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:ROM memory.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aici, adresa are dimensiunea de 4 biți, asadar putem accesa cu aceasta 16 locații diferite de memorie. Dimensiunea fiecărei locații este de 8 biți, așadar fiecare locație de memorie poate stoca numere de 8 biți. Spunem că memoria ROM este o memorie 16x8.  Capacitatea acestei memorii este de 16 x 8 biți = 128 biți.&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
&lt;br /&gt;
Următoarele circuite pot fi văzute în 2 moduri: ca memorii de tip ROM, cu date de ieșire care depind de adresa (data de intrare) de la care citești cât și ca circuite combinationale a căror ieșire este generată prin porți din intrare.&lt;br /&gt;
&lt;br /&gt;
=== Exemplul 1: Decodorul ===&lt;br /&gt;
Decodorul este circuitul care, pentru o anumită valoare a intrării, va genera la ieșire un șir binar care conține 1 pe poziția cu indicele egal cu valorea intrării și 0 in rest. De exemplu, decodorul de mai jos pe 2 biți va avea următoarea corespondență intrare-iesire:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;in&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;out&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2&amp;#039;b00 || 4&amp;#039;b0001&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b01 || 4&amp;#039;b0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b10 || 4&amp;#039;b0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b11 || 4&amp;#039;b1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Decoder.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
Vom implementa acest circuit ca memorie ROM. &amp;quot;in&amp;quot; are rolul de adresa iar out are rolul de date de la adresa respectiva. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Decoder(&lt;br /&gt;
  input logic [1:0] in,&lt;br /&gt;
  output logic [3:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always_comb begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      2&amp;#039;b00: out = 4&amp;#039;b0001; //la adresa 0 avem valoarea 1&lt;br /&gt;
      2&amp;#039;b01: out = 4&amp;#039;b0010; //la adresa 1 avem valoarea 2&lt;br /&gt;
      2&amp;#039;b10: out = 4&amp;#039;b0100; //la adresa 2 avem valoarea 4&lt;br /&gt;
      2&amp;#039;b11: out = 4&amp;#039;b1000; //la adresa 3 avem valoarea 8&lt;br /&gt;
      default: out = 4&amp;#039;b0000;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module Decoder_TB();&lt;br /&gt;
  logic [1:0] in_tb;&lt;br /&gt;
  logic [3:0] out_tb;&lt;br /&gt;
  &lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;4; idx = idx + 1) begin&lt;br /&gt;
      in_t = idx;&lt;br /&gt;
      #1;&lt;br /&gt;
    end &lt;br /&gt;
    #2 $stop();&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  Decoder DUT(&lt;br /&gt;
    .in(in_tb),&lt;br /&gt;
    .out(out_tb)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Circuitul Decoder va avea o intrare pe 2  biți, care va reprezenta adresa memoriei ROM și o iesire pe 4 biți, reprezentând conținuturile memoriei ROM corespunzătoare fiecărei combinații de la intrare.&lt;br /&gt;
* Chiar dacă în interiorul instrucțiunii &amp;#039;&amp;#039;case&amp;#039;&amp;#039; se acoperă toate cazurile posibile (toate combinațiile de 2 biți), este bine sa punem și un &amp;#039;&amp;#039;default&amp;#039;&amp;#039; pentru a evita inserarea în locul circuitului combinațional dorit (aici, memoria ROM) a unui latch.&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2: Transcodorul===&lt;br /&gt;
Trancodorul este o memorie ROM care asociază unei anumite intrări, reprezentată de adresă, un anumit cod, reprezentat de conținutului locației de memorie asociată acelei adrese.&lt;br /&gt;
&lt;br /&gt;
In acest exemplu, vom folosi transcodorul pentru a realiza un modul ce controlează afișajul cu 7 segmente. Acest dispozitiv de afișare este format, așa cum sugerează și numele, din 7 segmente ce pot fi controlate separat. Putem aprinde sau stinge fiecare segment controlând tensiunea aplicată pe acesta. Pentru acest afișaj, comanda este negativă: aplicând  0  logic pe un segment acesta se va aprinde, iar aplicând 1 logic, acesta se va stinge.&lt;br /&gt;
&lt;br /&gt;
Structura unui afisaj cu 7 segmente este prezentată în imaginea de mai jos:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:7LED display.PNG | 200px]]&lt;br /&gt;
&lt;br /&gt;
Pentru a realiza controlul afișării, avem nevoie de o memorie ROM ce trebuie să asocieze codului binar al fiecărui element ce poate fi afișat un șir de biți care sting sau aprind diversele segmente ale afișajului, astfel încât să apară imaginea elementului dorit.&lt;br /&gt;
&lt;br /&gt;
Pentru a reprezenta, de exemplu, cele 16 numere hexa, segmentele  trebuie  aprinse  conform Anexei 1. De exemplu, pentru primele 8 numere (0 până la 7), tabelul de asociere este următorul:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Număr&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Cod intrare&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Șir de afisare&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 0 || 4&amp;#039;b0000 || 7&amp;#039;b100_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 1 || 4&amp;#039;b0001 || 7&amp;#039;b111_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2 || 4&amp;#039;b0010 || 7&amp;#039;b010_0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 3 || 4&amp;#039;b0011 || 7&amp;#039;b011_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 4 || 4&amp;#039;b0100 || 7&amp;#039;b001_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 5 || 4&amp;#039;b0101 || 7&amp;#039;b001_0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 6 || 4&amp;#039;b0110 || 7&amp;#039;b000_0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 7 || 4&amp;#039;b0111 || 7&amp;#039;b111_1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a modulului Display7Seg&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Display7Seg(&lt;br /&gt;
  input logic [3:0] in,&lt;br /&gt;
  output logic [6:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always_comb begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      4&amp;#039;d0: out = 7&amp;#039;b1000000;&lt;br /&gt;
      4&amp;#039;d1: out = 7&amp;#039;b1111001;&lt;br /&gt;
      4&amp;#039;d2: out = 7&amp;#039;b0100100;&lt;br /&gt;
      4&amp;#039;d3: out = 7&amp;#039;b0110000;&lt;br /&gt;
      4&amp;#039;d4: out = 7&amp;#039;b0011001;&lt;br /&gt;
      4&amp;#039;d5: out = 7&amp;#039;b0010010;&lt;br /&gt;
      4&amp;#039;d6: out = 7&amp;#039;b0000010;&lt;br /&gt;
      4&amp;#039;d7: out = 7&amp;#039;b1111000;&lt;br /&gt;
      default: out = 7&amp;#039;b0000110;&lt;br /&gt;
    endcase &lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții:==&lt;br /&gt;
=== Exercițiul 1===&lt;br /&gt;
Completați codul din Exemplul 2 astfel încât să se poată reprezenta toate numerele în bază 16 (hexazecimal), conform Anexei 1&lt;br /&gt;
&lt;br /&gt;
=== Exercițiul 2===&lt;br /&gt;
Un procesor are nevoie de un șir de biți numit instrucțiune pentru a știi ce trebuie să facă. Această instrucțiune codează în șirul său de biți toate informațiile necesare. &lt;br /&gt;
&lt;br /&gt;
De exemplu, pentru un grup de instrucțiuni care operează cu registre, aceste informații pot fi:&lt;br /&gt;
* codul instrucțiunii (operation code - opcode): un șir de biți care ne spune ce operație se execută.&lt;br /&gt;
* destinația: un șir de biți care codează numărul registrului destinație.&lt;br /&gt;
* sursa1: un șir de biți care codează numărul registrului folosit ca operand 1.&lt;br /&gt;
* sursa2: un șir de biți care codează numărul registrului folosit ca operand 2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vom considera codul operației pe 4 biți, ceea ce inseamnă ca putem avea 16 instrucțiuni diferite. In plus, câmpurile care codează destinația și cei doi operanzi vor avea fiecare câte 4 biți, ceea ce inseamnă că vom avea 16 registre cu care putem lucra (R0 ... R15). Adunând dimensiunile fiecărui câmp, vom obține o instrucțiune pe 16 biți.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Instrucțiunile și codul operațiilor:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Vom considera ca procesorul nostru elementar poate suporta următoarele instrucțiuni:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Cod operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Sintaxă&amp;#039;&amp;#039;&amp;#039; ||&amp;#039;&amp;#039;&amp;#039;Descriere&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| ADD || 4&amp;#039;b0000 || ADD Rd Rs1 Rs2 || Rd = Rs1 + Rs2 &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| SUB || 4&amp;#039;b0001 || SUB Rd Rs1 Rs2 || Rd = Rs1 - Rs2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| OR || 4&amp;#039;b0010 || OR Rd Rs1 Rs2 || Rd = Rs1 OR Rs2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| AND || 4&amp;#039;b0011 || AND Rd Rs1 Rs2 || Rd = Rs1 AND Rs2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| LOADC || 4&amp;#039;b0100 || LOADC Rd, const || Rd = const&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pentru instrucțiunile prezentate mai sus, vom avea următoarele moduri de codare (de împărțire a informației în cadrul instrucțiunii):&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Codare instructiune.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Registrele:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Cele 16 registre vor fi codate cu un număr egal cu indexul său. De exemplu, R0 va avea codul 4&amp;#039;b000, R1 va avea codul 4&amp;#039;b0001 și așa mai departe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Considerând cele spuse mai sus, vom avea următoarele exemple de instrucțiuni:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Exemple codare instructiuni.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Având toate informațiile de mai sus, descrieți o memorie ROM cu adresă pe 4 biți și locații pe 16 biți, care să conțină următorul program, începând cu adresa 0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LOADC R0, 2h&lt;br /&gt;
LOADC R1, 5h&lt;br /&gt;
LOADC R2, 7h&lt;br /&gt;
ADD R3, R1, R0&lt;br /&gt;
SUB R4, R2, R1&lt;br /&gt;
OR R5, R3, R4&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercițiul 3===&lt;br /&gt;
Proiectați un Codor Cezar cu cheie fixă sub forma unei memorii ROM. &lt;br /&gt;
&lt;br /&gt;
Un Codor Cezar preia un mesaj și codează independent fiecare literă a acestuia pentru a obține un mesaj cifrat. El se folosește de o cheie fixă care se adună la fiecare literă a mesajului. De exemplu, pentru cheia &amp;quot;+3&amp;quot;: a-&amp;gt;d; b-&amp;gt;e; c-&amp;gt;f;...; y-&amp;gt;b; z-&amp;gt;c. Observați că atunci când alfabetul a ajuns la capăt, se reia de la început. &lt;br /&gt;
Pentru decodare, se va folosi procedura inversă: pentru fiecare literă, vom aplica cheia cu semn invers (în exemplul nostru, cheia de decodare este &amp;quot;-3&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
Observații, sfaturi, task-uri suplimentare:&lt;br /&gt;
* Codorul va putea prelucra doar litere mici și spațiu gol (acesta rămâne neschimbat).&lt;br /&gt;
* Cel mai usor mod de a scrie această funcționalitate este folosind un bloc de tip &amp;#039;&amp;#039;case&amp;#039;&amp;#039;.&lt;br /&gt;
* Pentru testare, se pot folosi în testbench variabile de tip &amp;#039;&amp;#039;logic&amp;#039;&amp;#039; pe 8 biți, astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [7:0] litera;&lt;br /&gt;
litera = &amp;quot;A&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Avansat: În SystemVerilog există și tipul de date &amp;#039;&amp;#039;string&amp;#039;&amp;#039;, ceea ce permite parcurgerea cu un &amp;#039;&amp;#039;for&amp;#039;&amp;#039; a mesajului. În Verilog clasic, astfel de parcurgeri sunt posibile, dar sintaxa este mai complicată.&lt;br /&gt;
* Se va folosi codul ASCII pentru valori. Pentru o ușoara vizualizare a datelor în simulare, se poate schimba radix-ul în ASCII. &lt;br /&gt;
* Avansat: Pentru a testa automat codul, se poate instanția încă un modul în testbench cu aceeași funcționalitate pe post de &amp;quot;golden model&amp;quot;. Acest modul nu trebuie să fie sintetizabil și atunci sintaxa permite mai multă libertate (cum ar fi operația de modulo &amp;quot;%&amp;quot;, utilă pentru testare, dar care determină un circuit complicat dacă ar fi sintetizată). Ieșirile celor două module din testbench sunt apoi comparate pentru a se verifica că ambele implementări oferă același rezultat.&lt;br /&gt;
* Implementați și Decodorul Cezar și testați Codorul împreună cu acesta. Aveți grijă ca cele două module să aibă aceeași cheie.&lt;br /&gt;
&lt;br /&gt;
==Anexa1== &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Anexa1.PNG | 800px]]&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_4_:_Memoria_ROM&amp;diff=7994</id>
		<title>CID aplicatii 4 : Memoria ROM</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_4_:_Memoria_ROM&amp;diff=7994"/>
		<updated>2025-03-11T09:20:50Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Exemple */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Memoria ROM==&lt;br /&gt;
Memoria este un dispozitiv electronic utilizat pentru stocarea datelor. Aceasta poate fi de mai multe feluri, având diverse caracteristici, cum ar fi capacitatea de a-și păstra sau nu conținutul după întreruperea alimentării sau capacitatea de a-și modifica sau nu conținutul după terminarea procesului de producție. &lt;br /&gt;
&lt;br /&gt;
Memoria  ROM (Read-Only  Memory) este un circuit combinațional folosit pentru stocarea unor date ce pot fi accesate cu ajutorul unei intrări de adresă. Asa cum sugerează și numele, memoria ROM clasică nu poate fi modificată. În plus, datorită modului în care este implementată, ea își păstrează conținutul după întreruperea alimentării (este nevolatilă).  &lt;br /&gt;
&lt;br /&gt;
Pentru a înțelege termenul de memorie, putem face următorul exercițiu de imaginație: să ne gândim la un dulap cu mai multe sertare. Conținutul memoriei este reprezentat de conținutul sertarelor, iar adresele sunt reprezentate de etichetele lipite pe aceste sertare pentru a le identifica. Dacă avem nevoie de conținutul unui sertar, va trebui să știm eticheta aferentă acestuia (adresa).&lt;br /&gt;
&lt;br /&gt;
O memorie ROM are următorii parametri: numărul de biți ai adresei, care este legat de numarul de locații de memorie (cu n biți de adresă putem forma 2&amp;lt;sup&amp;gt;𝑛&amp;lt;/sup&amp;gt; combinații diferite, deci putem accesa maxim 2&amp;lt;sup&amp;gt;𝑛&amp;lt;/sup&amp;gt; locații de memorie) și dimensiunea locației de memorie, care ne spune cât de multă informație poate stoca o locație de memorie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Să urmărim exemplul din figura următoare:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:ROM memory.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aici, adresa are dimensiunea de 4 biți, asadar putem accesa cu aceasta 16 locații diferite de memorie. Dimensiunea fiecărei locații este de 8 biți, așadar fiecare locație de memorie poate stoca numere de 8 biți. Spunem că memoria ROM este o memorie 16x8.  Capacitatea acestei memorii este de 16 x 8 biți = 128 biți.&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
&lt;br /&gt;
Următoarele circuite pot fi văzute în 2 moduri: ca memorii de tip ROM, cu date de ieșire care depind de adresa (data de intrare) de la care citești cât și ca circuite combinationale a căror ieșire este generată prin porți din intrare.&lt;br /&gt;
&lt;br /&gt;
=== Exemplul 1: Decodorul ===&lt;br /&gt;
Decodorul este circuitul care, pentru o anumită valoare a intrării, va genera la ieșire un șir binar care conține 1 pe poziția cu indicele egal cu valorea intrării și 0 in rest. De exemplu, decodorul de mai jos pe 2 biți va avea următoarea corespondență intrare-iesire:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;in&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;out&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2&amp;#039;b00 || 4&amp;#039;b0001&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b01 || 4&amp;#039;b0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b10 || 4&amp;#039;b0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b11 || 4&amp;#039;b1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Decoder.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
Vom implementa acest circuit ca memorie ROM. &amp;quot;in&amp;quot; are rolul de adresa iar out are rolul de date de la adresa respectiva. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Decoder(&lt;br /&gt;
  input logic [1:0] in,&lt;br /&gt;
  output logic [3:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always_comb begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      2&amp;#039;b00: out = 4&amp;#039;b0001; //la adresa 0 avem valoarea 1&lt;br /&gt;
      2&amp;#039;b01: out = 4&amp;#039;b0010; //la adresa 1 avem valoarea 2&lt;br /&gt;
      2&amp;#039;b10: out = 4&amp;#039;b0100; //la adresa 2 avem valoarea 4&lt;br /&gt;
      2&amp;#039;b11: out = 4&amp;#039;b1000; //la adresa 3 avem valoarea 8&lt;br /&gt;
      default: out = 4&amp;#039;b0000;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vom implementa acest circuit ca circuit combinational cu iesirile generate din intrari prin operatii logice.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Decodor_v2(&lt;br /&gt;
  input logic [1:0] in,&lt;br /&gt;
  output logic [3:0] out&lt;br /&gt;
  );&lt;br /&gt;
	&lt;br /&gt;
// fiecare bit din iesire calculat independent&lt;br /&gt;
assign out[0] = ~in[0] &amp;amp; ~in[1];&lt;br /&gt;
assign out[1] = in[0] &amp;amp; ~in[1];&lt;br /&gt;
assign out[2] = ~in[0] &amp;amp; in[1];&lt;br /&gt;
assign out[3] = in[0] &amp;amp; in[1];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module Decoder_TB();&lt;br /&gt;
  logic [1:0] in_tb;&lt;br /&gt;
  logic [3:0] out_tb;&lt;br /&gt;
  &lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;4; idx = idx + 1) begin&lt;br /&gt;
      in_t = idx;&lt;br /&gt;
      #1;&lt;br /&gt;
    end &lt;br /&gt;
    #2 $stop();&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  Decoder DUT(&lt;br /&gt;
    .in(in_tb),&lt;br /&gt;
    .out(out_tb)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Circuitul Decoder va avea o intrare pe 2  biți, care va reprezenta adresa memoriei ROM și o iesire pe 4 biți, reprezentând conținuturile memoriei ROM corespunzătoare fiecărei combinații de la intrare.&lt;br /&gt;
* Chiar dacă în interiorul instrucțiunii &amp;#039;&amp;#039;case&amp;#039;&amp;#039; se acoperă toate cazurile posibile (toate combinațiile de 2 biți), este bine sa punem și un &amp;#039;&amp;#039;default&amp;#039;&amp;#039; pentru a evita inserarea în locul circuitului combinațional dorit (aici, memoria ROM) a unui latch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2: Transcodorul===&lt;br /&gt;
Trancodorul este o memorie ROM care asociază unei anumite intrări, reprezentată de adresă, un anumit cod, reprezentat de conținutului locației de memorie asociată acelei adrese.&lt;br /&gt;
&lt;br /&gt;
In acest exemplu, vom folosi transcodorul pentru a realiza un modul ce controlează afișajul cu 7 segmente. Acest dispozitiv de afișare este format, așa cum sugerează și numele, din 7 segmente ce pot fi controlate separat. Putem aprinde sau stinge fiecare segment controlând tensiunea aplicată pe acesta. Pentru acest afișaj, comanda este negativă: aplicând  0  logic pe un segment acesta se va aprinde, iar aplicând 1 logic, acesta se va stinge.&lt;br /&gt;
&lt;br /&gt;
Structura unui afisaj cu 7 segmente este prezentată în imaginea de mai jos:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:7LED display.PNG | 200px]]&lt;br /&gt;
&lt;br /&gt;
Pentru a realiza controlul afișării, avem nevoie de o memorie ROM ce trebuie să asocieze codului binar al fiecărui element ce poate fi afișat un șir de biți care sting sau aprind diversele segmente ale afișajului, astfel încât să apară imaginea elementului dorit.&lt;br /&gt;
&lt;br /&gt;
Pentru a reprezenta, de exemplu, cele 16 numere hexa, segmentele  trebuie  aprinse  conform Anexei 1. De exemplu, pentru primele 8 numere (0 până la 7), tabelul de asociere este următorul:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Număr&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Cod intrare&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Șir de afisare&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 0 || 4&amp;#039;b0000 || 7&amp;#039;b100_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 1 || 4&amp;#039;b0001 || 7&amp;#039;b111_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2 || 4&amp;#039;b0010 || 7&amp;#039;b010_0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 3 || 4&amp;#039;b0011 || 7&amp;#039;b011_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 4 || 4&amp;#039;b0100 || 7&amp;#039;b001_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 5 || 4&amp;#039;b0101 || 7&amp;#039;b001_0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 6 || 4&amp;#039;b0110 || 7&amp;#039;b000_0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 7 || 4&amp;#039;b0111 || 7&amp;#039;b111_1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a modulului Display7Seg&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Display7Seg(&lt;br /&gt;
  input logic [3:0] in,&lt;br /&gt;
  output logic [6:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always_comb begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      4&amp;#039;d0: out = 7&amp;#039;b1000000;&lt;br /&gt;
      4&amp;#039;d1: out = 7&amp;#039;b1111001;&lt;br /&gt;
      4&amp;#039;d2: out = 7&amp;#039;b0100100;&lt;br /&gt;
      4&amp;#039;d3: out = 7&amp;#039;b0110000;&lt;br /&gt;
      4&amp;#039;d4: out = 7&amp;#039;b0011001;&lt;br /&gt;
      4&amp;#039;d5: out = 7&amp;#039;b0010010;&lt;br /&gt;
      4&amp;#039;d6: out = 7&amp;#039;b0000010;&lt;br /&gt;
      4&amp;#039;d7: out = 7&amp;#039;b1111000;&lt;br /&gt;
      default: out = 7&amp;#039;b0000110;&lt;br /&gt;
    endcase &lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții:==&lt;br /&gt;
=== Exercițiul 1===&lt;br /&gt;
Completați codul din Exemplul 2 astfel încât să se poată reprezenta toate numerele în bază 16 (hexazecimal), conform Anexei 1&lt;br /&gt;
&lt;br /&gt;
=== Exercițiul 2===&lt;br /&gt;
Un procesor are nevoie de un șir de biți numit instrucțiune pentru a știi ce trebuie să facă. Această instrucțiune codează în șirul său de biți toate informațiile necesare. &lt;br /&gt;
&lt;br /&gt;
De exemplu, pentru un grup de instrucțiuni care operează cu registre, aceste informații pot fi:&lt;br /&gt;
* codul instrucțiunii (operation code - opcode): un șir de biți care ne spune ce operație se execută.&lt;br /&gt;
* destinația: un șir de biți care codează numărul registrului destinație.&lt;br /&gt;
* sursa1: un șir de biți care codează numărul registrului folosit ca operand 1.&lt;br /&gt;
* sursa2: un șir de biți care codează numărul registrului folosit ca operand 2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vom considera codul operației pe 4 biți, ceea ce inseamnă ca putem avea 16 instrucțiuni diferite. In plus, câmpurile care codează destinația și cei doi operanzi vor avea fiecare câte 4 biți, ceea ce inseamnă că vom avea 16 registre cu care putem lucra (R0 ... R15). Adunând dimensiunile fiecărui câmp, vom obține o instrucțiune pe 16 biți.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Instrucțiunile și codul operațiilor:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Vom considera ca procesorul nostru elementar poate suporta următoarele instrucțiuni:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Cod operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Sintaxă&amp;#039;&amp;#039;&amp;#039; ||&amp;#039;&amp;#039;&amp;#039;Descriere&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| ADD || 4&amp;#039;b0000 || ADD Rd Rs1 Rs2 || Rd = Rs1 + Rs2 &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| SUB || 4&amp;#039;b0001 || SUB Rd Rs1 Rs2 || Rd = Rs1 - Rs2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| OR || 4&amp;#039;b0010 || OR Rd Rs1 Rs2 || Rd = Rs1 OR Rs2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| AND || 4&amp;#039;b0011 || AND Rd Rs1 Rs2 || Rd = Rs1 AND Rs2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| LOADC || 4&amp;#039;b0100 || LOADC Rd, const || Rd = const&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pentru instrucțiunile prezentate mai sus, vom avea următoarele moduri de codare (de împărțire a informației în cadrul instrucțiunii):&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Codare instructiune.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Registrele:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Cele 16 registre vor fi codate cu un număr egal cu indexul său. De exemplu, R0 va avea codul 4&amp;#039;b000, R1 va avea codul 4&amp;#039;b0001 și așa mai departe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Considerând cele spuse mai sus, vom avea următoarele exemple de instrucțiuni:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Exemple codare instructiuni.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Având toate informațiile de mai sus, descrieți o memorie ROM cu adresă pe 4 biți și locații pe 16 biți, care să conțină următorul program, începând cu adresa 0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LOADC R0, 2h&lt;br /&gt;
LOADC R1, 5h&lt;br /&gt;
LOADC R2, 7h&lt;br /&gt;
ADD R3, R1, R0&lt;br /&gt;
SUB R4, R2, R1&lt;br /&gt;
OR R5, R3, R4&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercițiul 3===&lt;br /&gt;
Proiectați un Codor Cezar cu cheie fixă sub forma unei memorii ROM. &lt;br /&gt;
&lt;br /&gt;
Un Codor Cezar preia un mesaj și codează independent fiecare literă a acestuia pentru a obține un mesaj cifrat. El se folosește de o cheie fixă care se adună la fiecare literă a mesajului. De exemplu, pentru cheia &amp;quot;+3&amp;quot;: a-&amp;gt;d; b-&amp;gt;e; c-&amp;gt;f;...; y-&amp;gt;b; z-&amp;gt;c. Observați că atunci când alfabetul a ajuns la capăt, se reia de la început. &lt;br /&gt;
Pentru decodare, se va folosi procedura inversă: pentru fiecare literă, vom aplica cheia cu semn invers (în exemplul nostru, cheia de decodare este &amp;quot;-3&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
Observații, sfaturi, task-uri suplimentare:&lt;br /&gt;
* Codorul va putea prelucra doar litere mici și spațiu gol (acesta rămâne neschimbat).&lt;br /&gt;
* Cel mai usor mod de a scrie această funcționalitate este folosind un bloc de tip &amp;#039;&amp;#039;case&amp;#039;&amp;#039;.&lt;br /&gt;
* Pentru testare, se pot folosi în testbench variabile de tip &amp;#039;&amp;#039;logic&amp;#039;&amp;#039; pe 8 biți, astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [7:0] litera;&lt;br /&gt;
litera = &amp;quot;A&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Avansat: În SystemVerilog există și tipul de date &amp;#039;&amp;#039;string&amp;#039;&amp;#039;, ceea ce permite parcurgerea cu un &amp;#039;&amp;#039;for&amp;#039;&amp;#039; a mesajului. În Verilog clasic, astfel de parcurgeri sunt posibile, dar sintaxa este mai complicată.&lt;br /&gt;
* Se va folosi codul ASCII pentru valori. Pentru o ușoara vizualizare a datelor în simulare, se poate schimba radix-ul în ASCII. &lt;br /&gt;
* Avansat: Pentru a testa automat codul, se poate instanția încă un modul în testbench cu aceeași funcționalitate pe post de &amp;quot;golden model&amp;quot;. Acest modul nu trebuie să fie sintetizabil și atunci sintaxa permite mai multă libertate (cum ar fi operația de modulo &amp;quot;%&amp;quot;, utilă pentru testare, dar care determină un circuit complicat dacă ar fi sintetizată). Ieșirile celor două module din testbench sunt apoi comparate pentru a se verifica că ambele implementări oferă același rezultat.&lt;br /&gt;
* Implementați și Decodorul Cezar și testați Codorul împreună cu acesta. Aveți grijă ca cele două module să aibă aceeași cheie.&lt;br /&gt;
&lt;br /&gt;
==Anexa1== &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Anexa1.PNG | 800px]]&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_4_:_Memoria_ROM&amp;diff=7993</id>
		<title>CID aplicatii 4 : Memoria ROM</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_4_:_Memoria_ROM&amp;diff=7993"/>
		<updated>2025-03-11T09:19:02Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Memoria ROM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Memoria ROM==&lt;br /&gt;
Memoria este un dispozitiv electronic utilizat pentru stocarea datelor. Aceasta poate fi de mai multe feluri, având diverse caracteristici, cum ar fi capacitatea de a-și păstra sau nu conținutul după întreruperea alimentării sau capacitatea de a-și modifica sau nu conținutul după terminarea procesului de producție. &lt;br /&gt;
&lt;br /&gt;
Memoria  ROM (Read-Only  Memory) este un circuit combinațional folosit pentru stocarea unor date ce pot fi accesate cu ajutorul unei intrări de adresă. Asa cum sugerează și numele, memoria ROM clasică nu poate fi modificată. În plus, datorită modului în care este implementată, ea își păstrează conținutul după întreruperea alimentării (este nevolatilă).  &lt;br /&gt;
&lt;br /&gt;
Pentru a înțelege termenul de memorie, putem face următorul exercițiu de imaginație: să ne gândim la un dulap cu mai multe sertare. Conținutul memoriei este reprezentat de conținutul sertarelor, iar adresele sunt reprezentate de etichetele lipite pe aceste sertare pentru a le identifica. Dacă avem nevoie de conținutul unui sertar, va trebui să știm eticheta aferentă acestuia (adresa).&lt;br /&gt;
&lt;br /&gt;
O memorie ROM are următorii parametri: numărul de biți ai adresei, care este legat de numarul de locații de memorie (cu n biți de adresă putem forma 2&amp;lt;sup&amp;gt;𝑛&amp;lt;/sup&amp;gt; combinații diferite, deci putem accesa maxim 2&amp;lt;sup&amp;gt;𝑛&amp;lt;/sup&amp;gt; locații de memorie) și dimensiunea locației de memorie, care ne spune cât de multă informație poate stoca o locație de memorie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Să urmărim exemplul din figura următoare:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:ROM memory.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aici, adresa are dimensiunea de 4 biți, asadar putem accesa cu aceasta 16 locații diferite de memorie. Dimensiunea fiecărei locații este de 8 biți, așadar fiecare locație de memorie poate stoca numere de 8 biți. Spunem că memoria ROM este o memorie 16x8.  Capacitatea acestei memorii este de 16 x 8 biți = 128 biți.&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
&lt;br /&gt;
Urmatoarele circuite pot fi vazute in 2 moduri: ca memorii de tip ROM, cu date de iesire care depind de adresa (data de intrare) de la care citesti cat si ca circuite combinationale a caror iesire este generata prin porti din intrare.&lt;br /&gt;
&lt;br /&gt;
=== Exemplul 1: Decodorul ===&lt;br /&gt;
Decodorul este circuitul care, pentru o anumită valoare a intrării, va genera la ieșire un șir binar care conține 1 pe poziția cu indicele egal cu valorea intrării și 0 in rest. De exemplu, decodorul de mai jos pe 2 biți va avea următoarea corespondență intrare-iesire:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;in&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;out&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2&amp;#039;b00 || 4&amp;#039;b0001&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b01 || 4&amp;#039;b0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b10 || 4&amp;#039;b0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b11 || 4&amp;#039;b1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Decoder.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
Vom implementa acest circuit ca memorie ROM. &amp;quot;in&amp;quot; are rolul de adresa iar out are rolul de date de la adresa respectiva. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Decoder(&lt;br /&gt;
  input logic [1:0] in,&lt;br /&gt;
  output logic [3:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always_comb begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      2&amp;#039;b00: out = 4&amp;#039;b0001; //la adresa 0 avem valoarea 1&lt;br /&gt;
      2&amp;#039;b01: out = 4&amp;#039;b0010; //la adresa 1 avem valoarea 2&lt;br /&gt;
      2&amp;#039;b10: out = 4&amp;#039;b0100; //la adresa 2 avem valoarea 4&lt;br /&gt;
      2&amp;#039;b11: out = 4&amp;#039;b1000; //la adresa 3 avem valoarea 8&lt;br /&gt;
      default: out = 4&amp;#039;b0000;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vom implementa acest circuit ca circuit combinational cu iesirile generate din intrari prin operatii logice.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Decodor_v2(&lt;br /&gt;
  input logic [1:0] in,&lt;br /&gt;
  output logic [3:0] out&lt;br /&gt;
  );&lt;br /&gt;
	&lt;br /&gt;
// fiecare bit din iesire calculat independent&lt;br /&gt;
assign out[0] = ~in[0] &amp;amp; ~in[1];&lt;br /&gt;
assign out[1] = in[0] &amp;amp; ~in[1];&lt;br /&gt;
assign out[2] = ~in[0] &amp;amp; in[1];&lt;br /&gt;
assign out[3] = in[0] &amp;amp; in[1];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module Decoder_TB();&lt;br /&gt;
  logic [1:0] in_tb;&lt;br /&gt;
  logic [3:0] out_tb;&lt;br /&gt;
  &lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;4; idx = idx + 1) begin&lt;br /&gt;
      in_t = idx;&lt;br /&gt;
      #1;&lt;br /&gt;
    end &lt;br /&gt;
    #2 $stop();&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  Decoder DUT(&lt;br /&gt;
    .in(in_tb),&lt;br /&gt;
    .out(out_tb)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Circuitul Decoder va avea o intrare pe 2  biți, care va reprezenta adresa memoriei ROM și o iesire pe 4 biți, reprezentând conținuturile memoriei ROM corespunzătoare fiecărei combinații de la intrare.&lt;br /&gt;
* Chiar dacă în interiorul instrucțiunii &amp;#039;&amp;#039;case&amp;#039;&amp;#039; se acoperă toate cazurile posibile (toate combinațiile de 2 biți), este bine sa punem și un &amp;#039;&amp;#039;default&amp;#039;&amp;#039; pentru a evita inserarea în locul circuitului combinațional dorit (aici, memoria ROM) a unui latch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2: Transcodorul===&lt;br /&gt;
Trancodorul este o memorie ROM care asociază unei anumite intrări, reprezentată de adresă, un anumit cod, reprezentat de conținutului locației de memorie asociată acelei adrese.&lt;br /&gt;
&lt;br /&gt;
In acest exemplu, vom folosi transcodorul pentru a realiza un modul ce controlează afișajul cu 7 segmente. Acest dispozitiv de afișare este format, așa cum sugerează și numele, din 7 segmente ce pot fi controlate separat. Putem aprinde sau stinge fiecare segment controlând tensiunea aplicată pe acesta. Pentru acest afișaj, comanda este negativă: aplicând  0  logic pe un segment acesta se va aprinde, iar aplicând 1 logic, acesta se va stinge.&lt;br /&gt;
&lt;br /&gt;
Structura unui afisaj cu 7 segmente este prezentată în imaginea de mai jos:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:7LED display.PNG | 200px]]&lt;br /&gt;
&lt;br /&gt;
Pentru a realiza controlul afișării, avem nevoie de o memorie ROM ce trebuie să asocieze codului binar al fiecărui element ce poate fi afișat un șir de biți care sting sau aprind diversele segmente ale afișajului, astfel încât să apară imaginea elementului dorit.&lt;br /&gt;
&lt;br /&gt;
Pentru a reprezenta, de exemplu, cele 16 numere hexa, segmentele  trebuie  aprinse  conform Anexei 1. De exemplu, pentru primele 8 numere (0 până la 7), tabelul de asociere este următorul:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Număr&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Cod intrare&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Șir de afisare&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 0 || 4&amp;#039;b0000 || 7&amp;#039;b100_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 1 || 4&amp;#039;b0001 || 7&amp;#039;b111_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2 || 4&amp;#039;b0010 || 7&amp;#039;b010_0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 3 || 4&amp;#039;b0011 || 7&amp;#039;b011_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 4 || 4&amp;#039;b0100 || 7&amp;#039;b001_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 5 || 4&amp;#039;b0101 || 7&amp;#039;b001_0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 6 || 4&amp;#039;b0110 || 7&amp;#039;b000_0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 7 || 4&amp;#039;b0111 || 7&amp;#039;b111_1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a modulului Display7Seg&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Display7Seg(&lt;br /&gt;
  input logic [3:0] in,&lt;br /&gt;
  output logic [6:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always_comb begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      4&amp;#039;d0: out = 7&amp;#039;b1000000;&lt;br /&gt;
      4&amp;#039;d1: out = 7&amp;#039;b1111001;&lt;br /&gt;
      4&amp;#039;d2: out = 7&amp;#039;b0100100;&lt;br /&gt;
      4&amp;#039;d3: out = 7&amp;#039;b0110000;&lt;br /&gt;
      4&amp;#039;d4: out = 7&amp;#039;b0011001;&lt;br /&gt;
      4&amp;#039;d5: out = 7&amp;#039;b0010010;&lt;br /&gt;
      4&amp;#039;d6: out = 7&amp;#039;b0000010;&lt;br /&gt;
      4&amp;#039;d7: out = 7&amp;#039;b1111000;&lt;br /&gt;
      default: out = 7&amp;#039;b0000110;&lt;br /&gt;
    endcase &lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții:==&lt;br /&gt;
=== Exercițiul 1===&lt;br /&gt;
Completați codul din Exemplul 2 astfel încât să se poată reprezenta toate numerele în bază 16 (hexazecimal), conform Anexei 1&lt;br /&gt;
&lt;br /&gt;
=== Exercițiul 2===&lt;br /&gt;
Un procesor are nevoie de un șir de biți numit instrucțiune pentru a știi ce trebuie să facă. Această instrucțiune codează în șirul său de biți toate informațiile necesare. &lt;br /&gt;
&lt;br /&gt;
De exemplu, pentru un grup de instrucțiuni care operează cu registre, aceste informații pot fi:&lt;br /&gt;
* codul instrucțiunii (operation code - opcode): un șir de biți care ne spune ce operație se execută.&lt;br /&gt;
* destinația: un șir de biți care codează numărul registrului destinație.&lt;br /&gt;
* sursa1: un șir de biți care codează numărul registrului folosit ca operand 1.&lt;br /&gt;
* sursa2: un șir de biți care codează numărul registrului folosit ca operand 2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vom considera codul operației pe 4 biți, ceea ce inseamnă ca putem avea 16 instrucțiuni diferite. In plus, câmpurile care codează destinația și cei doi operanzi vor avea fiecare câte 4 biți, ceea ce inseamnă că vom avea 16 registre cu care putem lucra (R0 ... R15). Adunând dimensiunile fiecărui câmp, vom obține o instrucțiune pe 16 biți.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Instrucțiunile și codul operațiilor:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Vom considera ca procesorul nostru elementar poate suporta următoarele instrucțiuni:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Cod operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Sintaxă&amp;#039;&amp;#039;&amp;#039; ||&amp;#039;&amp;#039;&amp;#039;Descriere&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| ADD || 4&amp;#039;b0000 || ADD Rd Rs1 Rs2 || Rd = Rs1 + Rs2 &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| SUB || 4&amp;#039;b0001 || SUB Rd Rs1 Rs2 || Rd = Rs1 - Rs2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| OR || 4&amp;#039;b0010 || OR Rd Rs1 Rs2 || Rd = Rs1 OR Rs2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| AND || 4&amp;#039;b0011 || AND Rd Rs1 Rs2 || Rd = Rs1 AND Rs2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| LOADC || 4&amp;#039;b0100 || LOADC Rd, const || Rd = const&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pentru instrucțiunile prezentate mai sus, vom avea următoarele moduri de codare (de împărțire a informației în cadrul instrucțiunii):&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Codare instructiune.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Registrele:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Cele 16 registre vor fi codate cu un număr egal cu indexul său. De exemplu, R0 va avea codul 4&amp;#039;b000, R1 va avea codul 4&amp;#039;b0001 și așa mai departe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Considerând cele spuse mai sus, vom avea următoarele exemple de instrucțiuni:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Exemple codare instructiuni.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Având toate informațiile de mai sus, descrieți o memorie ROM cu adresă pe 4 biți și locații pe 16 biți, care să conțină următorul program, începând cu adresa 0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LOADC R0, 2h&lt;br /&gt;
LOADC R1, 5h&lt;br /&gt;
LOADC R2, 7h&lt;br /&gt;
ADD R3, R1, R0&lt;br /&gt;
SUB R4, R2, R1&lt;br /&gt;
OR R5, R3, R4&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercițiul 3===&lt;br /&gt;
Proiectați un Codor Cezar cu cheie fixă sub forma unei memorii ROM. &lt;br /&gt;
&lt;br /&gt;
Un Codor Cezar preia un mesaj și codează independent fiecare literă a acestuia pentru a obține un mesaj cifrat. El se folosește de o cheie fixă care se adună la fiecare literă a mesajului. De exemplu, pentru cheia &amp;quot;+3&amp;quot;: a-&amp;gt;d; b-&amp;gt;e; c-&amp;gt;f;...; y-&amp;gt;b; z-&amp;gt;c. Observați că atunci când alfabetul a ajuns la capăt, se reia de la început. &lt;br /&gt;
Pentru decodare, se va folosi procedura inversă: pentru fiecare literă, vom aplica cheia cu semn invers (în exemplul nostru, cheia de decodare este &amp;quot;-3&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
Observații, sfaturi, task-uri suplimentare:&lt;br /&gt;
* Codorul va putea prelucra doar litere mici și spațiu gol (acesta rămâne neschimbat).&lt;br /&gt;
* Cel mai usor mod de a scrie această funcționalitate este folosind un bloc de tip &amp;#039;&amp;#039;case&amp;#039;&amp;#039;.&lt;br /&gt;
* Pentru testare, se pot folosi în testbench variabile de tip &amp;#039;&amp;#039;logic&amp;#039;&amp;#039; pe 8 biți, astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [7:0] litera;&lt;br /&gt;
litera = &amp;quot;A&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Avansat: În SystemVerilog există și tipul de date &amp;#039;&amp;#039;string&amp;#039;&amp;#039;, ceea ce permite parcurgerea cu un &amp;#039;&amp;#039;for&amp;#039;&amp;#039; a mesajului. În Verilog clasic, astfel de parcurgeri sunt posibile, dar sintaxa este mai complicată.&lt;br /&gt;
* Se va folosi codul ASCII pentru valori. Pentru o ușoara vizualizare a datelor în simulare, se poate schimba radix-ul în ASCII. &lt;br /&gt;
* Avansat: Pentru a testa automat codul, se poate instanția încă un modul în testbench cu aceeași funcționalitate pe post de &amp;quot;golden model&amp;quot;. Acest modul nu trebuie să fie sintetizabil și atunci sintaxa permite mai multă libertate (cum ar fi operația de modulo &amp;quot;%&amp;quot;, utilă pentru testare, dar care determină un circuit complicat dacă ar fi sintetizată). Ieșirile celor două module din testbench sunt apoi comparate pentru a se verifica că ambele implementări oferă același rezultat.&lt;br /&gt;
* Implementați și Decodorul Cezar și testați Codorul împreună cu acesta. Aveți grijă ca cele două module să aibă aceeași cheie.&lt;br /&gt;
&lt;br /&gt;
==Anexa1== &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Anexa1.PNG | 800px]]&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Circuite_Integrate_Digitale&amp;diff=7992</id>
		<title>Circuite Integrate Digitale</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Circuite_Integrate_Digitale&amp;diff=7992"/>
		<updated>2025-03-11T09:17:52Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Scopul laboratorului ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Laboratorul de circuite integrate digitale vine ca o completare practica a cursului de CID. &lt;br /&gt;
Prin definitie, acesta se va axa pe elemente practice de simulare, sinteza si testare a circuitelor ce sunt prezentate la curs. &lt;br /&gt;
&lt;br /&gt;
Acest laborator se bazeaza pe limbajul &amp;quot;SystemVerilog&amp;quot;, acesta fiind unul din cele 2 limbaje de descriere hardware folosite in industrie la ora actuala (celalalt fiind &amp;quot;VHDL&amp;quot;). &amp;quot;SystemVerilog&amp;quot; vine ca o completare la &amp;quot;Verilog&amp;quot;, introducand numeroase elemente ce ajuta in special testarea circuitelor, dar si unele imbunatatiri pentru procesul de proiectare. &lt;br /&gt;
&lt;br /&gt;
Platformele sunt structurate astfel incat sa contina cateva elemente de teorie minimala, un exemplu de circuit descris in cod Verilog si apoi exercitii pe care sa le rezolvati in ora de aplicatii (simulare/testare pe placa FPGA) si acasa (simulare). &lt;br /&gt;
&lt;br /&gt;
In laborator se va lucra in Vivado, program al firmei Xilinx, pe o placa PYNQ-Z2 impreuna cu o placa de extensie ce adauga leduri si butoane suplimentare. &lt;br /&gt;
&lt;br /&gt;
Circuitele digitale sunt o parte fundamentala a electronici moderne, cu numeroase oportunitati in industrie, atat in design cat si in verificarea circuitelor.&lt;br /&gt;
&lt;br /&gt;
Pe langa ce veti invata in acest laborator, limbajul ofera si capabilitati mai avansate pentru a descrie mai eficient circuitele dorite, cat si pentru testarea acestora. Sintaxa nu se termina cu ce invatati aici si pentru cei pasionati, nu ezitati sa va contactati cadrul didactic cu intrebari.&lt;br /&gt;
&lt;br /&gt;
Speram ca o sa va placa, veti invata si vi se va parea interesant ce veti vedea in orele de aplicatii ce urmeaza. Spor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tutoriale și documentații ==&lt;br /&gt;
&lt;br /&gt;
Programul Vivado este gratuit (necesita cont, dar este gratis) si poate fi descarcat si instalat urmand tutorialul de aici:&lt;br /&gt;
# [[Tutorial instalare Vivado]]&lt;br /&gt;
# [[Tutorial Vivado]].&lt;br /&gt;
# [[FPGA - Introducere]].&lt;br /&gt;
# [https://www.realdigital.org/doc/02013cd17602c8af749f00561f88ae21 Boolean Board - user manual]&lt;br /&gt;
# [[Boolean Board - Pinout]].&lt;br /&gt;
# [https://www.tulembedded.com/FPGA/ProductsPYNQ-Z2.html Pynq-Z2 - pagina oficiala]&lt;br /&gt;
# [https://dpoauwgwqsy2x.cloudfront.net/Download/pynqz2_user_manual_v1_0.pdf Pynq-Z2 - user manual]&lt;br /&gt;
# [[Pynq-Z2 - Pinout]].&lt;br /&gt;
	&lt;br /&gt;
O lista de link-uri utile poate fi gasita aici:&lt;br /&gt;
# [[Introducere. SystemVerilog HDL]] (Sintaxa [[SystemVerilog]])&lt;br /&gt;
# [https://www.asic-world.com/digital/index.html Asic-world - digital]&lt;br /&gt;
# [https://www.asic-world.com/verilog/index.html Asic-world - verilog]&lt;br /&gt;
# [https://nandgame.com/ Joc online: Nandgame]	&lt;br /&gt;
# [https://circuitverse.org/simulator Simulator/joc online si grafic de circuite: Circuitverse]	&lt;br /&gt;
# [https://falstad.com/circuit/ Simulator online si grafic de circuite (analog+digital): Falstad]&lt;br /&gt;
# [https://github.com/hneemann/Digital Simulator grafic de circuite digitale: hneemann-digital]&lt;br /&gt;
# [https://play.google.com/store/apps/details?id=com.ViacheslavRud.Circuit&amp;amp;hl=en_US&amp;amp;gl=US Joc android - Make it True: Solve the Circuit]&lt;br /&gt;
# [https://www.edaplayground.com/ Simulatoare online (mod text): Edaplayground]&lt;br /&gt;
# [https://wavedrom.com/ Utilitar desenare forme de unda]&lt;br /&gt;
# [https://www.draw.io/ Utilitar desenare diagrame]&lt;br /&gt;
# [[Domenii conexe]]&lt;br /&gt;
&lt;br /&gt;
== Lucrări de laborator ==&lt;br /&gt;
&lt;br /&gt;
# [[CID_aplicatii_1 : Generare de forme de unda]]&lt;br /&gt;
# [[CID_aplicatii_2 : Instantiere si porti logice]]&lt;br /&gt;
# [[CID_aplicatii_3 : Circuite combinationale elementare]]&lt;br /&gt;
# [[CID_aplicatii_4 : Memoria ROM]]&lt;br /&gt;
# [[CID_aplicatii_5 : Exercitii cu circuite combinationale]]&lt;br /&gt;
# CID_aplicatii_6 : Lucrarea 1 - circuite combinationale&lt;br /&gt;
# [[CID_aplicatii_7 : Circuite secventiale elementare]]&lt;br /&gt;
# [[CID_aplicatii_8 : Registre si memorii RAM]]&lt;br /&gt;
# [[CID_aplicatii_9 : Numaratorul]]&lt;br /&gt;
# [[CID_aplicatii_10 : Aplicatii cu numaratoare]]&lt;br /&gt;
# [[CID_aplicatii_11 : Automate finite]]&lt;br /&gt;
# [[CID_aplicatii_12 : Exercitii cu circuite secventiale]]&lt;br /&gt;
# CID_aplicatii_13 : Lucrarea 2 - circuite secventiale&lt;br /&gt;
# [[CID_aplicatii_14 : Circuite digitale complexe]]&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_4_:_Alte_circuite_combinationale&amp;diff=7991</id>
		<title>CID aplicatii 4 : Alte circuite combinationale</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_4_:_Alte_circuite_combinationale&amp;diff=7991"/>
		<updated>2025-03-11T09:17:17Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: Gvpopescu a redenumit pagina CID aplicatii 4 : Alte circuite combinationale în CID aplicatii 4 : Memoria ROM&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECTEAZA [[CID aplicatii 4 : Memoria ROM]]&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_4_:_Memoria_ROM&amp;diff=7990</id>
		<title>CID aplicatii 4 : Memoria ROM</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_4_:_Memoria_ROM&amp;diff=7990"/>
		<updated>2025-03-11T09:17:16Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: Gvpopescu a redenumit pagina CID aplicatii 4 : Alte circuite combinationale în CID aplicatii 4 : Memoria ROM&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Memoria ROM==&lt;br /&gt;
Memoria este un dispozitiv electronic utilizat pentru stocarea datelor. Aceasta poate fi de mai multe feluri, având diverse caracteristici, cum ar fi capacitatea de a-și păstra sau nu conținutul după întreruperea alimentării sau capacitatea de a-și modifica sau nu conținutul după terminarea procesului de producție. &lt;br /&gt;
&lt;br /&gt;
Memoria  ROM (Read-Only  Memory) este un circuit combinational folosit pentru stocarea unor date ce pot fi accesate cu ajutorul unei intrari de adresă. Asa cum sugerează și numele, memoria ROM clasică nu poate fi modificată. În plus, datorită modului în care este implementată, ea își păstrează conținutul după întreruperea alimentării (este nevolatilă).  &lt;br /&gt;
&lt;br /&gt;
Pentru a înțelege termenul de memorie, putem face următorul exercițiu de imaginație: să ne gândim la un dulap cu mai multe sertare. Conținutul memoriei este reprezentat de conținutul sertarelor, iar adresele sunt reprezentate de etichetele lipite pe aceste sertare pentru a le identifica. Dacă avem nevoie de conținutul unui sertar, va trebui să știm eticheta aferentă acestuia (adresa).&lt;br /&gt;
&lt;br /&gt;
O memorie ROM are următorii parametri: numărul de biți ai adresei, care este legat de numarul de locații de memorie (cu n biți de adresă putem forma 2&amp;lt;sup&amp;gt;𝑛&amp;lt;/sup&amp;gt; combinații diferite, deci putem accesa maxim 2&amp;lt;sup&amp;gt;𝑛&amp;lt;/sup&amp;gt; locații de memorie) și dimensiunea locației de memorie, care ne spune cât de multă informație poate stoca o locație de memorie.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Să urmărim exemplul din figura următoare:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:ROM memory.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Aici, adresa are dimensiunea de 4 biți, asadar putem accesa cu aceasta 16 locații diferite de memorie. Dimensiunea fiecărei locații este de 8 biți, așadar fiecare locație de memorie poate stoca numere de 8 biți. Spunem că memoria ROM este o memorie 16x8.  Capacitatea acestei memorii este de 16 x 8 biți = 128 biți.&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
&lt;br /&gt;
Urmatoarele circuite pot fi vazute in 2 moduri: ca memorii de tip ROM, cu date de iesire care depind de adresa (data de intrare) de la care citesti cat si ca circuite combinationale a caror iesire este generata prin porti din intrare.&lt;br /&gt;
&lt;br /&gt;
=== Exemplul 1: Decodorul ===&lt;br /&gt;
Decodorul este circuitul care, pentru o anumită valoare a intrării, va genera la ieșire un șir binar care conține 1 pe poziția cu indicele egal cu valorea intrării și 0 in rest. De exemplu, decodorul de mai jos pe 2 biți va avea următoarea corespondență intrare-iesire:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;in&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;out&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2&amp;#039;b00 || 4&amp;#039;b0001&lt;br /&gt;
|- align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b01 || 4&amp;#039;b0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b10 || 4&amp;#039;b0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
|2&amp;#039;b11 || 4&amp;#039;b1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Decoder.PNG ‎| 400px]]&lt;br /&gt;
&lt;br /&gt;
Vom implementa acest circuit ca memorie ROM. &amp;quot;in&amp;quot; are rolul de adresa iar out are rolul de date de la adresa respectiva. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Decoder(&lt;br /&gt;
  input logic [1:0] in,&lt;br /&gt;
  output logic [3:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always_comb begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      2&amp;#039;b00: out = 4&amp;#039;b0001; //la adresa 0 avem valoarea 1&lt;br /&gt;
      2&amp;#039;b01: out = 4&amp;#039;b0010; //la adresa 1 avem valoarea 2&lt;br /&gt;
      2&amp;#039;b10: out = 4&amp;#039;b0100; //la adresa 2 avem valoarea 4&lt;br /&gt;
      2&amp;#039;b11: out = 4&amp;#039;b1000; //la adresa 3 avem valoarea 8&lt;br /&gt;
      default: out = 4&amp;#039;b0000;&lt;br /&gt;
    endcase&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vom implementa acest circuit ca circuit combinational cu iesirile generate din intrari prin operatii logice.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Decodor_v2(&lt;br /&gt;
  input logic [1:0] in,&lt;br /&gt;
  output logic [3:0] out&lt;br /&gt;
  );&lt;br /&gt;
	&lt;br /&gt;
// fiecare bit din iesire calculat independent&lt;br /&gt;
assign out[0] = ~in[0] &amp;amp; ~in[1];&lt;br /&gt;
assign out[1] = in[0] &amp;amp; ~in[1];&lt;br /&gt;
assign out[2] = ~in[0] &amp;amp; in[1];&lt;br /&gt;
assign out[3] = in[0] &amp;amp; in[1];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a modulului de test&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module Decoder_TB();&lt;br /&gt;
  logic [1:0] in_tb;&lt;br /&gt;
  logic [3:0] out_tb;&lt;br /&gt;
  &lt;br /&gt;
  integer idx;&lt;br /&gt;
&lt;br /&gt;
  initial begin&lt;br /&gt;
    for(idx=0; idx&amp;lt;4; idx = idx + 1) begin&lt;br /&gt;
      in_t = idx;&lt;br /&gt;
      #1;&lt;br /&gt;
    end &lt;br /&gt;
    #2 $stop();&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  Decoder DUT(&lt;br /&gt;
    .in(in_tb),&lt;br /&gt;
    .out(out_tb)&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observații:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Circuitul Decoder va avea o intrare pe 2  biți, care va reprezenta adresa memoriei ROM și o iesire pe 4 biți, reprezentând conținuturile memoriei ROM corespunzătoare fiecărei combinații de la intrare.&lt;br /&gt;
* Chiar dacă în interiorul instrucțiunii &amp;#039;&amp;#039;case&amp;#039;&amp;#039; se acoperă toate cazurile posibile (toate combinațiile de 2 biți), este bine sa punem și un &amp;#039;&amp;#039;default&amp;#039;&amp;#039; pentru a evita inserarea în locul circuitului combinațional dorit (aici, memoria ROM) a unui latch.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2: Transcodorul===&lt;br /&gt;
Trancodorul este o memorie ROM care asociază unei anumite intrări, reprezentată de adresă, un anumit cod, reprezentat de conținutului locației de memorie asociată acelei adrese.&lt;br /&gt;
&lt;br /&gt;
In acest exemplu, vom folosi transcodorul pentru a realiza un modul ce controlează afișajul cu 7 segmente. Acest dispozitiv de afișare este format, așa cum sugerează și numele, din 7 segmente ce pot fi controlate separat. Putem aprinde sau stinge fiecare segment controlând tensiunea aplicată pe acesta. Pentru acest afișaj, comanda este negativă: aplicând  0  logic pe un segment acesta se va aprinde, iar aplicând 1 logic, acesta se va stinge.&lt;br /&gt;
&lt;br /&gt;
Structura unui afisaj cu 7 segmente este prezentată în imaginea de mai jos:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:7LED display.PNG | 200px]]&lt;br /&gt;
&lt;br /&gt;
Pentru a realiza controlul afișării, avem nevoie de o memorie ROM ce trebuie să asocieze codului binar al fiecărui element ce poate fi afișat un șir de biți care sting sau aprind diversele segmente ale afișajului, astfel încât să apară imaginea elementului dorit.&lt;br /&gt;
&lt;br /&gt;
Pentru a reprezenta, de exemplu, cele 16 numere hexa, segmentele  trebuie  aprinse  conform Anexei 1. De exemplu, pentru primele 8 numere (0 până la 7), tabelul de asociere este următorul:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Număr&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Cod intrare&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Șir de afisare&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 0 || 4&amp;#039;b0000 || 7&amp;#039;b100_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 1 || 4&amp;#039;b0001 || 7&amp;#039;b111_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 2 || 4&amp;#039;b0010 || 7&amp;#039;b010_0100&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 3 || 4&amp;#039;b0011 || 7&amp;#039;b011_0000&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 4 || 4&amp;#039;b0100 || 7&amp;#039;b001_1001&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 5 || 4&amp;#039;b0101 || 7&amp;#039;b001_0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 6 || 4&amp;#039;b0110 || 7&amp;#039;b000_0010&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| 7 || 4&amp;#039;b0111 || 7&amp;#039;b111_1000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea SystemVerilog a modulului Display7Seg&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Display7Seg(&lt;br /&gt;
  input logic [3:0] in,&lt;br /&gt;
  output logic [6:0] out&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  always_comb begin&lt;br /&gt;
    case(in)&lt;br /&gt;
      4&amp;#039;d0: out = 7&amp;#039;b1000000;&lt;br /&gt;
      4&amp;#039;d1: out = 7&amp;#039;b1111001;&lt;br /&gt;
      4&amp;#039;d2: out = 7&amp;#039;b0100100;&lt;br /&gt;
      4&amp;#039;d3: out = 7&amp;#039;b0110000;&lt;br /&gt;
      4&amp;#039;d4: out = 7&amp;#039;b0011001;&lt;br /&gt;
      4&amp;#039;d5: out = 7&amp;#039;b0010010;&lt;br /&gt;
      4&amp;#039;d6: out = 7&amp;#039;b0000010;&lt;br /&gt;
      4&amp;#039;d7: out = 7&amp;#039;b1111000;&lt;br /&gt;
      default: out = 7&amp;#039;b0000110;&lt;br /&gt;
    endcase &lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exerciții:==&lt;br /&gt;
=== Exercițiul 1===&lt;br /&gt;
Completați codul din Exemplul 2 astfel încât să se poată reprezenta toate numerele în bază 16 (hexazecimal), conform Anexei 1&lt;br /&gt;
&lt;br /&gt;
=== Exercițiul 2===&lt;br /&gt;
Un procesor are nevoie de un șir de biți numit instrucțiune pentru a știi ce trebuie să facă. Această instrucțiune codează în șirul său de biți toate informațiile necesare. &lt;br /&gt;
&lt;br /&gt;
De exemplu, pentru un grup de instrucțiuni care operează cu registre, aceste informații pot fi:&lt;br /&gt;
* codul instrucțiunii (operation code - opcode): un șir de biți care ne spune ce operație se execută.&lt;br /&gt;
* destinația: un șir de biți care codează numărul registrului destinație.&lt;br /&gt;
* sursa1: un șir de biți care codează numărul registrului folosit ca operand 1.&lt;br /&gt;
* sursa2: un șir de biți care codează numărul registrului folosit ca operand 2.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vom considera codul operației pe 4 biți, ceea ce inseamnă ca putem avea 16 instrucțiuni diferite. In plus, câmpurile care codează destinația și cei doi operanzi vor avea fiecare câte 4 biți, ceea ce inseamnă că vom avea 16 registre cu care putem lucra (R0 ... R15). Adunând dimensiunile fiecărui câmp, vom obține o instrucțiune pe 16 biți.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Instrucțiunile și codul operațiilor:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Vom considera ca procesorul nostru elementar poate suporta următoarele instrucțiuni:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Cod operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Sintaxă&amp;#039;&amp;#039;&amp;#039; ||&amp;#039;&amp;#039;&amp;#039;Descriere&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| ADD || 4&amp;#039;b0000 || ADD Rd Rs1 Rs2 || Rd = Rs1 + Rs2 &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| SUB || 4&amp;#039;b0001 || SUB Rd Rs1 Rs2 || Rd = Rs1 - Rs2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| OR || 4&amp;#039;b0010 || OR Rd Rs1 Rs2 || Rd = Rs1 OR Rs2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| AND || 4&amp;#039;b0011 || AND Rd Rs1 Rs2 || Rd = Rs1 AND Rs2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| LOADC || 4&amp;#039;b0100 || LOADC Rd, const || Rd = const&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pentru instrucțiunile prezentate mai sus, vom avea următoarele moduri de codare (de împărțire a informației în cadrul instrucțiunii):&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Codare instructiune.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Registrele:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Cele 16 registre vor fi codate cu un număr egal cu indexul său. De exemplu, R0 va avea codul 4&amp;#039;b000, R1 va avea codul 4&amp;#039;b0001 și așa mai departe.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Considerând cele spuse mai sus, vom avea următoarele exemple de instrucțiuni:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Exemple codare instructiuni.png | 400px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Având toate informațiile de mai sus, descrieți o memorie ROM cu adresă pe 4 biți și locații pe 16 biți, care să conțină următorul program, începând cu adresa 0:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LOADC R0, 2h&lt;br /&gt;
LOADC R1, 5h&lt;br /&gt;
LOADC R2, 7h&lt;br /&gt;
ADD R3, R1, R0&lt;br /&gt;
SUB R4, R2, R1&lt;br /&gt;
OR R5, R3, R4&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exercițiul 3===&lt;br /&gt;
Proiectați un Codor Cezar cu cheie fixă sub forma unei memorii ROM. &lt;br /&gt;
&lt;br /&gt;
Un Codor Cezar preia un mesaj și codează independent fiecare literă a acestuia pentru a obține un mesaj cifrat. El se folosește de o cheie fixă care se adună la fiecare literă a mesajului. De exemplu, pentru cheia &amp;quot;+3&amp;quot;: a-&amp;gt;d; b-&amp;gt;e; c-&amp;gt;f;...; y-&amp;gt;b; z-&amp;gt;c. Observați că atunci când alfabetul a ajuns la capăt, se reia de la început. &lt;br /&gt;
Pentru decodare, se va folosi procedura inversă: pentru fiecare literă, vom aplica cheia cu semn invers (în exemplul nostru, cheia de decodare este &amp;quot;-3&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
Observații, sfaturi, task-uri suplimentare:&lt;br /&gt;
* Codorul va putea prelucra doar litere mici și spațiu gol (acesta rămâne neschimbat).&lt;br /&gt;
* Cel mai usor mod de a scrie această funcționalitate este folosind un bloc de tip &amp;#039;&amp;#039;case&amp;#039;&amp;#039;.&lt;br /&gt;
* Pentru testare, se pot folosi în testbench variabile de tip &amp;#039;&amp;#039;logic&amp;#039;&amp;#039; pe 8 biți, astfel: &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [7:0] litera;&lt;br /&gt;
litera = &amp;quot;A&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* Avansat: În SystemVerilog există și tipul de date &amp;#039;&amp;#039;string&amp;#039;&amp;#039;, ceea ce permite parcurgerea cu un &amp;#039;&amp;#039;for&amp;#039;&amp;#039; a mesajului. În Verilog clasic, astfel de parcurgeri sunt posibile, dar sintaxa este mai complicată.&lt;br /&gt;
* Se va folosi codul ASCII pentru valori. Pentru o ușoara vizualizare a datelor în simulare, se poate schimba radix-ul în ASCII. &lt;br /&gt;
* Avansat: Pentru a testa automat codul, se poate instanția încă un modul în testbench cu aceeași funcționalitate pe post de &amp;quot;golden model&amp;quot;. Acest modul nu trebuie să fie sintetizabil și atunci sintaxa permite mai multă libertate (cum ar fi operația de modulo &amp;quot;%&amp;quot;, utilă pentru testare, dar care determină un circuit complicat dacă ar fi sintetizată). Ieșirile celor două module din testbench sunt apoi comparate pentru a se verifica că ambele implementări oferă același rezultat.&lt;br /&gt;
* Implementați și Decodorul Cezar și testați Codorul împreună cu acesta. Aveți grijă ca cele două module să aibă aceeași cheie.&lt;br /&gt;
&lt;br /&gt;
==Anexa1== &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Anexa1.PNG | 800px]]&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7917</id>
		<title>SystemVerilog</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7917"/>
		<updated>2025-02-20T10:20:23Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Operatori de shiftare pe biți */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Module (sintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
Limbajul SystemVerilog este structurat pe module. Fiecare modul reprezintă un circuit care implementează o anume funcție. De exemplu, un modul poate reprezenta un sumator, adică un circuit care are două intrări ce specifică cei doi operanzi și o ieșire ce reprezintă rezultatul adunării. Conținutul modulului reprezintă descrierea (structurală sau comportamentală) a porților care calculeaza suma celor două intrări. Prin urmare, definiția unui modul SystemVerilog are două părți:&lt;br /&gt;
* interfață - lista tuturor porturilor de intrare și ieșire ale circuitului, specificate prin nume și dimensiune;&lt;br /&gt;
* implementare - descrierea efectivă a circuitului care se folosește de valorile de intrare pentru a calcula valorile de ieșire;&lt;br /&gt;
&lt;br /&gt;
=== Interfața modulelor SystemVerilog ===&lt;br /&gt;
Interfața modulului &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; este prezentată mai jos. &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ca și în sistemul numeral zecimal, unde suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; cifre are nevoie de &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; cifre (9 + 9 = 18), și în sistemul binar, suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; biți va fi pe &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; biți.&lt;br /&gt;
[[Fișier:Adder_interface.svg|thumb|Reprezentarea interfetei modulului &amp;quot;Adder&amp;quot; (black box)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Cuvintele cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;endmodule&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; sunt folosite pentru a începe și a încheia definirea unui modul. Imediat după cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; urmează numele modulului. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Numele unui modul va începe cu literă mare.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După definirea numelui modulului, urmează lista de porturi, plasată între &amp;#039;&amp;#039;&amp;#039;paranteze rotunde&amp;#039;&amp;#039;&amp;#039; și separate prin &amp;#039;&amp;#039;&amp;#039;virgulă&amp;#039;&amp;#039;&amp;#039;. Cuvintele cheie acceptate sunt &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;output&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de ieșire), &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;input&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de intrare) și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port bidirecțional).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AA00&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Când aveți de ales în privința interfeței unui modul, se evită utilizarea semnalelor de tip &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;. Acestea introduc elemente de tip [http://en.wikipedia.org/wiki/Tri-state_buffer#Tri-state_Buffer Tri-state Buffer] care sunt ineficiente. O alternativă mai eficientă este definirea a două porturi, unul de intrare și unul de ieșire, cu nume similare (ex: &amp;#039;&amp;#039;data_in&amp;#039;&amp;#039; și &amp;#039;&amp;#039;data_out&amp;#039;&amp;#039;).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Întâi se definesc ieșirile, apoi intrările unui modul.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Porturile unui modul se scriu unul sub altul, pe câte o linie, aliniate cu un tab la dreapta față de cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După tipul portului, urmează dimensiunea acestuia, specificată în indecșii biților, unde cel mai puțin semnificativ bit are indexul 0. Spre exemplu, un semnal de 4 biți va avea următoarea specificație &amp;#039;&amp;#039;&amp;#039;[3:0]&amp;#039;&amp;#039;&amp;#039; (bitul cel mai semnificativ are indexul 3, cel mai puțin semnificativ 0, în total 4 biți). &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Semnalelor de un bit le lipsește specificația de dimensiune:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
input semnal_de_un_bit,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După lista de porturi aflată între paranteze, definirea interfeței se termină cu caracterul &amp;#039;&amp;#039;&amp;#039;;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Există module nesintetizabile (care nu au corespondent in porți logice), care sunt folosite ca &amp;quot;programe&amp;quot; de test în medii de simulare și se numesc module de test. Aceste module nu au porturi de intrare și ieșire și sunt utilizate doar pentru a da valori porturilor de intrare ale modulului care se testează, și de a verifica valorile de pe porturile de ieșire ale acestuia. În cazul acestor module, lista de porturi și parantezele rotunde aferente lipsesc:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module TestModule;&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementarea modulelor SystemVerilog ===&lt;br /&gt;
&lt;br /&gt;
Implementarea modulelor SystemVerilog se face prin blocuri. Aceste blocuri pot avea sau nu corespondent într-un ciruit fizic. Dacă toate blocurile unui modul au corespondent într-un circuit fizic, atunci modulul este sintetizabil și poate fi transformat într-un circuit fizic. Blocurile care pot genera construcții sintetizabile sunt de patru tipuri:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri de instanțiere&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;generate&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Blocurile care sunt întotdeauna nesintetizabile și sunt folosite exclusiv pentru simulare:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Nu orice bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; este sintetizabil. Există construcții valide sintactic dar care nu au corespondent unui circuit. Aceste blocuri pot fi simulate, dar nu pot fi utilizate pentru programarea unei plăci [[FPGA]].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ordinea blocurilor într-un modul nu contează.&lt;br /&gt;
&lt;br /&gt;
==== Cuvântul cheie &amp;quot;logic&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
In SystemVerilog, toate semnalele sunt de tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, indiferent de natura lor. În urma sintezei, semnalele vor deveni fire, latch-uri sau registre.&lt;br /&gt;
&lt;br /&gt;
Semnalele într-un modul SystemVerilog se definesc în felul următor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
logic [3:0] semnal;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Niciun element nu își poate schimba valoarea în mai mult de un bloc.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Adder.png|thumb|Modulul Adder implementat]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assign&amp;#039;&amp;#039;&amp;#039; este un cuvănt cheie care generează [[circuite combinaționale]]. Cum sumatorul este un [[circuite combinaționale|circuit combinațional]], îl putem implementa cu un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign out = in0 + in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; În general, un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; va genera un circuit sintetizabil. Există și excepții, atunci când operația dorită este prea complexă pentru a fi implementată printr-un circuit combinațional, în mod eficient. Spre exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
assign out = in0 / in1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nu este un cod sintetizabil pentru majoritatea tool-urilor de sinteză, dar funcționează perfect într-o simulare.&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinaționale ====&lt;br /&gt;
&lt;br /&gt;
Formatul pentru un bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinational este următorul:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    //...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un bloc de tip &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; este sensibil la modificare oricarui semnal din cadrul modulului unde a fost definit, iesirile comandate de acest bloc sunt recalculate la orice modificare a unui semnal de intrare.&lt;br /&gt;
&lt;br /&gt;
În acest caz, putem reface implementarea sumatorului folosind un bloc &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    out = in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; secvențiale. Asignări non-blocante (non-blocking assignments) ====&lt;br /&gt;
&lt;br /&gt;
[[Circuite secvențiale|Circuitele secvențiale]] sunt circuitele care sunt sincronizate de [[Circuite secvențiale#Semnalul de ceas|semnalul de ceas]]. Acest semnal este, de obicei, produs de un generator de ceas și se definește ca intrare pentru fiecare modul secvențial (în care există cel puțin un registru). Putem modifica exemplul anterior, astfel încât ieșirea modulului de sumare să fie sincronă (adică să se modifice doar pe frontul pozitiv de ceas). Astfel, în interfața modulului, apare și semnalul de ceas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementation here&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Pentru descrierea circuitelor secvențiale, se folosește întotdeauna un bloc &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:SyncedAdder.png|thumb|Modulul SyncedAdder]]&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; descrie un circuit secvențial și are în lista de sensitivități, de obicei, doar semnalul de ceas. Acesta este sensibil la o tranziție a semnalului de ceas (numită front), de obicei cea din 0 în 1 (numită frontul pozitiv, sau frontul crescător al ceasului). Astfel, putem implementa sumatorul sincron în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    out &amp;lt;= in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Cuvântul cheie care specifică frontul pozitiv al unui semnal este &amp;#039;&amp;#039;&amp;#039;posedge&amp;#039;&amp;#039;&amp;#039;, iar cel pentru frontul negativ al semnalului este &amp;#039;&amp;#039;&amp;#039;negedge&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Observați operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; folosit pentru atribuirea sumei registrului destinație. Acesta NU este operatorul logic de &amp;#039;&amp;#039;mai mic sau egal&amp;#039;&amp;#039;, ci reprezintă un mod de atribuire care se numește non-blocantă. Diferența dintre atribuirea blocantă (&amp;#039;&amp;#039;&amp;#039;=&amp;#039;&amp;#039;&amp;#039;) și cea non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) este că cea de-a doua întâi evalueaza toate expresiile din partea dreaptă a operatorului de atribuire (în cazul de față, suma &amp;#039;&amp;#039;in0 + in1&amp;#039;&amp;#039;) și abia apoi asignează rezultatul registrului destinație. Spre exemplu, dacă dorim să inversăm valorile a două registre, &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; și &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;, astfel încât &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; să ia valoarea lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039; și invers, vom face în felul următor: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod corect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 &amp;lt;= reg1;&lt;br /&gt;
    reg1 &amp;lt;= reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modulul se va comporta conform așteptărilor. Operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; nu va bloca restul evaluărilor din blocul always și prin urmare toate asignările se fac simultan, după evaluarea expresiilor din partea dreaptă a operatorului. Pe de altă parte, dacă facem asignarea blocantă:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod incorect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 = reg1;&lt;br /&gt;
    reg1 = reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
aceasta va bloca restul operațiilor până când asignarea se termină. În acest caz, după primul front de ceas, ambele registre vor conține valoarea inițială a lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Operatorul de asignare non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) se folosește doar în blocuri &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; În același bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;, se folosește același tip de operator de asignare pentru toate operațiile. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Utilizați asignare non-blocantă pentru toate blocurile &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; care generează circuite secvențiale (sunt sincronizate de ceas) și asignare blocantă în toate celelalte cazuri. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri de instanțiere ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:adder4.png|thumb|Un sumator de patru numere format din trei sumatoare de două numere]]&lt;br /&gt;
&lt;br /&gt;
Odată definit un modul, acesta poate fi folosit de oricâte ori pe parcursul unuia sau mai multor proiecte. Acest sistem se numește instanțiere. Să luam, ca exemplu, un modul care trebuie să facă suma a 4 numere pe 3 biți. Putem să folosim în acest scop modulul &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; pe 4 biți definit mai sus, în configurația din figură. Observați că se utilizează același modul de trei ori. Este ineficient și inutil să scriem de trei ori implementarea modulului, așa că vom recurge la metoda instanțierii. Orice instanță a unui modul trebuie să aibă un nume unic, după cum și într-un limbaj de programare, variabilele de același fel trebuie sa aibă un nume unic.&lt;br /&gt;
&lt;br /&gt;
Se observă în continuare că există semnale (fire) în modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039;, care nu sunt nici intrări, nici ieșiri, și sunt folosite doar pentru conectarea modulelor &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; (cel roșu și cel verde). &lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru instanțierea unui modul este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
NumeModulInstantiat numeInstanta(&lt;br /&gt;
    .nume_intrare_sau_iesire_0(nume_semnal_legat_la_intrare_sau_iesire_0),&lt;br /&gt;
    .nume_intrare_sau_iesire_1(nume_semnal_legat_la_intrare_sau_iesire_1),&lt;br /&gt;
    //...&lt;br /&gt;
    .nume_intrare_sau_iesire_n(nume_semnal_legat_la_intrare_sau_iesire_n),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Codul SystemVerilog pentru modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039; este:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [3:0] subsum0;&lt;br /&gt;
logic [3:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0(in0),        //la intrarea numita in0 a instantei adder0 se leaga intrarea in0 a modulului&lt;br /&gt;
    .in1(in1)         //la intrarea numita in1 a instantei adder0 se leaga intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0(in2),        //la intrarea numita in0 a instantei adder1 se leaga intrarea in2 a modulului&lt;br /&gt;
    .in1(in3)         //la intrarea numita in1 a instantei adder1 se leaga intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),        //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0),    //la intrarea numita in0 a instantei adder2 se leaga firul subsum0&lt;br /&gt;
    .in1(subsum1)     //la intrarea numita in1 a instantei adder2 se leaga firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Instanțele adder0 și adder1 au legate la intrări semnale de 3 biți și la ieșiri fire de 4 biți, cu toate că porturile lor au 4, respectiv 5 biți (intrările și ieșirile). În acest caz, semnalele se leagă fiind aliniate la cel mai puțin semnificativ bit și se generează un mesaj de avertizare (port mismatch). Cu toate că programele folosite de noi acceptă codul de mai sus, există programe care nu acceptă astfel de construcții. Pentru a fi riguroși, vom folosi operatorul de concatenare pentru a corecta codul în felul următor (mai multe despre operatori veți putea afla mai jos):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3,&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [4:0] subsum0; //definim firele pe 5 biți deoarece iesirea instantelor adder0 si adder1 este pe 5 biti&lt;br /&gt;
logic [4:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0({1&amp;#039;b0,in0}), //la intrarea numita in0 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in0 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in1})  //la intrarea numita in1 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0({1&amp;#039;b0,in2}), //la intrarea numita in0 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in2 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in3})  //la intrarea numita in1 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),           //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0[3:0]),  //la intrarea numita in0 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum0&lt;br /&gt;
    .in1(subsum1[3:0])   //la intrarea numita in1 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module de test (nesintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
[[Fișier:addertester.png|thumb|Modul de test pentru sumatorul pe 4 biți]]&lt;br /&gt;
&lt;br /&gt;
Modulele de test sunt folosite pentru verificarea funcționalității unui alt modul sintetizabil. Figura alăturată prezintă schema bloc pentru un modul de test pentru sumatorul pe 4 biți. Un modul de test generic urmărește câteva reguli clare:&lt;br /&gt;
&lt;br /&gt;
* pentru fiecare intrare a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu intrarea, folosite pentru a genera stimuli pentru circuit;&lt;br /&gt;
* pentru fiecare ieșire a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu ieșirea, folosite pentru verificarea comportamentului (de obicei prin afișarea de forme de undă);&lt;br /&gt;
* se instanțiază modulul de testat și se leagă variabilele definite anterior la intrările și ieșirile instanței;&lt;br /&gt;
* se scrie un generator de stimuli (un bloc &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;) în care se programeaza o secvență temporizată de tranziții pentru intrări;&lt;br /&gt;
* se folosește un software de simulare pentru a rula testul și a vedea formele de undă.&lt;br /&gt;
&lt;br /&gt;
Astfel, modulul de test pentru sumatorul pe 4 biți va arăta astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AdderTester;&lt;br /&gt;
&lt;br /&gt;
//this is the definition of variables and wires&lt;br /&gt;
//for driving signals  &lt;br /&gt;
logic [3:0] i0;&lt;br /&gt;
logic [3:0] i1;&lt;br /&gt;
logic [4:0] o;&lt;br /&gt;
&lt;br /&gt;
//this is where the stimuls is added for the module&lt;br /&gt;
initial begin&lt;br /&gt;
     i0 = 0;&lt;br /&gt;
     i1 = 0;&lt;br /&gt;
  #5 i0 = 3;&lt;br /&gt;
  #2 i0 = 2;&lt;br /&gt;
     i1 = 1;&lt;br /&gt;
  #3 i0 = 1;&lt;br /&gt;
     i1 = 5;&lt;br /&gt;
  #5 $stop();&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
//this is where the tested module is instantiated  &lt;br /&gt;
Adder deviceUnderTest(&lt;br /&gt;
  .out(o),&lt;br /&gt;
  .in0(i0),&lt;br /&gt;
  .in1(i1)&lt;br /&gt;
);  &lt;br /&gt;
  &lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; este folosit pentru a da valori intrărilor modulului de testat. El iși începe execuția la momentul de timp t = 0. Fiecare linie este executată la același moment de tip, până când este întâlnit operatorul #, care așteaptă trecerea unor unități de timp. Astfel, în exemplul de mai sus, primele două linii se execută la t = 0, linia 3 se execută la t = 5, liniile 4 și 5 la t = 7, liniile 6 și 7 la t = 10 și ultima linie, la t = 15. Apelul funcției $stop() determină sfârșitul simulării.&lt;br /&gt;
&lt;br /&gt;
=== Semnalul de ceas în module de test ===&lt;br /&gt;
&lt;br /&gt;
Cuvântul cheie &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este folosit pentru a executa o atribuire sau apel de funcție în mod repetat, până la sfârșitul simulării. Acesta este în particular folositor pentru a genera un semnal de ceas. Secvența următoare de cod generează un semnal de ceas cu perioada de două unități de timp:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
reg clock;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock = 0;&lt;br /&gt;
    forever #1 clock = !clock;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Regulă:&amp;lt;/font&amp;gt;Pentru circuitele secvențiale, modulul de test va avea două blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. Primul este similar celui de mai sus, și utilizat pentru generarea semnalului de ceas. Al doilea este folosit pentru generarea celorlalte semnale de intrare și directivei de oprire a simulării. Motivul pentru această segregare este faptul că instrucțiunea &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este blocantă (adică instrucțiunile puse după ea nu se execută). Toate blocurile &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; dintr-un modul de test se execută în paralel.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sintaxa SystemVerilog ==&lt;br /&gt;
&lt;br /&gt;
=== Constante ===&lt;br /&gt;
&lt;br /&gt;
Constantele sunt valori numerice. Pentru fiecare valoare, se specifică numărul de biți pe care reprezentată si baza în care este scrisă. Spre exemplu &amp;#039;&amp;#039;&amp;#039;8&amp;#039;b111&amp;#039;&amp;#039;&amp;#039; este o constantă pe 8 biți a cărei valoare în binar este 111 (adică în decimal, 7). În același fel, &amp;#039;&amp;#039;&amp;#039;16&amp;#039;d10&amp;#039;&amp;#039;&amp;#039; reprezintă valoarea 10 în decimal reprezentată pe 16 biți. Este posibilă specificarea valorii fără număr de biți sau bază (în care caz baza implicită este cea decimală, și numărul de biți este aproximat de către compilator).&lt;br /&gt;
&lt;br /&gt;
=== Operatori ===&lt;br /&gt;
&lt;br /&gt;
==== Operatori aritmetici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Adunare || + || a + b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Scădere || - || a - b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Înmulțire || * || a * b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Împărțire || / || a / b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori logici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Egal || == || a == b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Diferit || != || a != b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic || &amp;lt; || a &amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic sau egal || &amp;lt;= || a &amp;lt;= b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare || &amp;gt; || a &amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare sau egal || &amp;gt;= || a &amp;gt;= b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori binari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și || &amp;amp; || a &amp;amp; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv || ^ || a ^ b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Operatori unari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Negare || ~ || ~b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și pe biții unui semnal|| &amp;amp; || &amp;amp;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau pe biții unui semnal|| &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv pe biții unui semnal|| ^ || ^a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori de shiftare (deplasare) pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la stânga  || &amp;lt;&amp;lt; || a &amp;lt;&amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la dreapta  || &amp;gt;&amp;gt; || a &amp;gt;&amp;gt; b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de acces la biți ====&lt;br /&gt;
&lt;br /&gt;
Dându-se un semnal pe n biți, operatorul de access la o sub-secvență din biții semnalului este &amp;#039;&amp;#039;&amp;#039;[m:k]&amp;#039;&amp;#039;&amp;#039; unde m și k sunt indecșii biților doriți, cu n &amp;lt; m &amp;lt; k. Ca exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [31:0] un_registru;&lt;br /&gt;
logic [7:0] un_fir;&lt;br /&gt;
logic alt_fir;&lt;br /&gt;
&lt;br /&gt;
assign un_fir = un_registru[30:23]; //firul &amp;quot;un_fir&amp;quot; ia valoarea data de secventa de biti de la 23 la 30 din registrul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
assign alt_fir = un_fir[3];         //firul &amp;quot;alt_fir&amp;quot; va lua valoarea bitului 3 din semnalul &amp;quot;un_fir&amp;quot; care este bitul 26 din semnalul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de concatenare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de concatenare este &amp;quot;{&amp;quot; și &amp;quot;}&amp;quot;. Astfel, o serie de semnale separate prin virgulă și închise între două acolade va rezulta într-un singur semnal de dimensiune egală cu suma dimensiunilor semnalelor componente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [3:0] a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic c;&lt;br /&gt;
logic [9:0] d;&lt;br /&gt;
&lt;br /&gt;
//semnalul d este format din concatenarea semnalelor a,b,c&lt;br /&gt;
//unde a este pe pozitia cea mai semnificativa si c&lt;br /&gt;
//pe pozitia cea mai putin semnificativa&lt;br /&gt;
assign d = {a,b,c};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de replicare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de replicare este folosit când se dorește replicarea unui semnal de un număr mare sau necunoscut de ori (dat ca parametru). Astfel, construcția &amp;#039;&amp;#039;&amp;#039;{n{m}}&amp;#039;&amp;#039;&amp;#039; reprezintă semnalul &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039;, multiplcat de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; ori.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic [7:0] c;&lt;br /&gt;
logic [15:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = {5{a}}; //b va lua valoarea data de a, replicata de 5 ori&lt;br /&gt;
assign d = {2{c}}; //d va lua valoarea lui c (8 biti) replicata de 2 ori&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Blocuri și operatori condiționali ===&lt;br /&gt;
&lt;br /&gt;
Condițiile se pot exprima în trei moduri:&lt;br /&gt;
* folosing operatorul condițional cunoscut din limbajul C (condiție &amp;#039;&amp;#039;&amp;#039;?&amp;#039;&amp;#039;&amp;#039; valoare_pentru_adevărat &amp;#039;&amp;#039;&amp;#039;:&amp;#039;&amp;#039;&amp;#039; valoare_pentru_fals);&lt;br /&gt;
* folosind construcția &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* folosind constructia &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; respectiv &amp;#039;&amp;#039;&amp;#039;casex - endcase&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;casez - endcase&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Operatorul condițional se poate utiliza în orice tip de bloc. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = a ? c : d; //daca a este adevarat (adica daca este egal cu 1), atunci b ia valoarea lui c, altfel, b ia valoarea lui d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocurile &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; se pot utiliza doar în blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    if(a) begin&lt;br /&gt;
        b = c;&lt;br /&gt;
    end else begin&lt;br /&gt;
        b = d;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemplu &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [1:0] a;&lt;br /&gt;
logic  [3:0] e;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
//daca a este egal cu 0, atunci e ia valoarea lui c&lt;br /&gt;
//daca a este egal cu 1, atunci e ia valoarea lui d&lt;br /&gt;
//in orice alt caz, b ia valoarea 0&lt;br /&gt;
always_comb begin&lt;br /&gt;
    case(a)&lt;br /&gt;
        2&amp;#039;b00: e = c;&lt;br /&gt;
        2&amp;#039;b01: e = d;&lt;br /&gt;
        default: e = 3&amp;#039;b000;&lt;br /&gt;
    endcase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7916</id>
		<title>SystemVerilog</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7916"/>
		<updated>2025-02-20T10:18:28Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Blocuri de instanțiere */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Module (sintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
Limbajul SystemVerilog este structurat pe module. Fiecare modul reprezintă un circuit care implementează o anume funcție. De exemplu, un modul poate reprezenta un sumator, adică un circuit care are două intrări ce specifică cei doi operanzi și o ieșire ce reprezintă rezultatul adunării. Conținutul modulului reprezintă descrierea (structurală sau comportamentală) a porților care calculeaza suma celor două intrări. Prin urmare, definiția unui modul SystemVerilog are două părți:&lt;br /&gt;
* interfață - lista tuturor porturilor de intrare și ieșire ale circuitului, specificate prin nume și dimensiune;&lt;br /&gt;
* implementare - descrierea efectivă a circuitului care se folosește de valorile de intrare pentru a calcula valorile de ieșire;&lt;br /&gt;
&lt;br /&gt;
=== Interfața modulelor SystemVerilog ===&lt;br /&gt;
Interfața modulului &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; este prezentată mai jos. &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ca și în sistemul numeral zecimal, unde suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; cifre are nevoie de &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; cifre (9 + 9 = 18), și în sistemul binar, suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; biți va fi pe &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; biți.&lt;br /&gt;
[[Fișier:Adder_interface.svg|thumb|Reprezentarea interfetei modulului &amp;quot;Adder&amp;quot; (black box)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Cuvintele cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;endmodule&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; sunt folosite pentru a începe și a încheia definirea unui modul. Imediat după cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; urmează numele modulului. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Numele unui modul va începe cu literă mare.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După definirea numelui modulului, urmează lista de porturi, plasată între &amp;#039;&amp;#039;&amp;#039;paranteze rotunde&amp;#039;&amp;#039;&amp;#039; și separate prin &amp;#039;&amp;#039;&amp;#039;virgulă&amp;#039;&amp;#039;&amp;#039;. Cuvintele cheie acceptate sunt &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;output&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de ieșire), &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;input&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de intrare) și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port bidirecțional).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AA00&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Când aveți de ales în privința interfeței unui modul, se evită utilizarea semnalelor de tip &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;. Acestea introduc elemente de tip [http://en.wikipedia.org/wiki/Tri-state_buffer#Tri-state_Buffer Tri-state Buffer] care sunt ineficiente. O alternativă mai eficientă este definirea a două porturi, unul de intrare și unul de ieșire, cu nume similare (ex: &amp;#039;&amp;#039;data_in&amp;#039;&amp;#039; și &amp;#039;&amp;#039;data_out&amp;#039;&amp;#039;).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Întâi se definesc ieșirile, apoi intrările unui modul.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Porturile unui modul se scriu unul sub altul, pe câte o linie, aliniate cu un tab la dreapta față de cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După tipul portului, urmează dimensiunea acestuia, specificată în indecșii biților, unde cel mai puțin semnificativ bit are indexul 0. Spre exemplu, un semnal de 4 biți va avea următoarea specificație &amp;#039;&amp;#039;&amp;#039;[3:0]&amp;#039;&amp;#039;&amp;#039; (bitul cel mai semnificativ are indexul 3, cel mai puțin semnificativ 0, în total 4 biți). &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Semnalelor de un bit le lipsește specificația de dimensiune:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
input semnal_de_un_bit,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După lista de porturi aflată între paranteze, definirea interfeței se termină cu caracterul &amp;#039;&amp;#039;&amp;#039;;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Există module nesintetizabile (care nu au corespondent in porți logice), care sunt folosite ca &amp;quot;programe&amp;quot; de test în medii de simulare și se numesc module de test. Aceste module nu au porturi de intrare și ieșire și sunt utilizate doar pentru a da valori porturilor de intrare ale modulului care se testează, și de a verifica valorile de pe porturile de ieșire ale acestuia. În cazul acestor module, lista de porturi și parantezele rotunde aferente lipsesc:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module TestModule;&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementarea modulelor SystemVerilog ===&lt;br /&gt;
&lt;br /&gt;
Implementarea modulelor SystemVerilog se face prin blocuri. Aceste blocuri pot avea sau nu corespondent într-un ciruit fizic. Dacă toate blocurile unui modul au corespondent într-un circuit fizic, atunci modulul este sintetizabil și poate fi transformat într-un circuit fizic. Blocurile care pot genera construcții sintetizabile sunt de patru tipuri:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri de instanțiere&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;generate&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Blocurile care sunt întotdeauna nesintetizabile și sunt folosite exclusiv pentru simulare:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Nu orice bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; este sintetizabil. Există construcții valide sintactic dar care nu au corespondent unui circuit. Aceste blocuri pot fi simulate, dar nu pot fi utilizate pentru programarea unei plăci [[FPGA]].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ordinea blocurilor într-un modul nu contează.&lt;br /&gt;
&lt;br /&gt;
==== Cuvântul cheie &amp;quot;logic&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
In SystemVerilog, toate semnalele sunt de tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, indiferent de natura lor. În urma sintezei, semnalele vor deveni fire, latch-uri sau registre.&lt;br /&gt;
&lt;br /&gt;
Semnalele într-un modul SystemVerilog se definesc în felul următor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
logic [3:0] semnal;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Niciun element nu își poate schimba valoarea în mai mult de un bloc.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Adder.png|thumb|Modulul Adder implementat]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assign&amp;#039;&amp;#039;&amp;#039; este un cuvănt cheie care generează [[circuite combinaționale]]. Cum sumatorul este un [[circuite combinaționale|circuit combinațional]], îl putem implementa cu un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign out = in0 + in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; În general, un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; va genera un circuit sintetizabil. Există și excepții, atunci când operația dorită este prea complexă pentru a fi implementată printr-un circuit combinațional, în mod eficient. Spre exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
assign out = in0 / in1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nu este un cod sintetizabil pentru majoritatea tool-urilor de sinteză, dar funcționează perfect într-o simulare.&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinaționale ====&lt;br /&gt;
&lt;br /&gt;
Formatul pentru un bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinational este următorul:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    //...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un bloc de tip &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; este sensibil la modificare oricarui semnal din cadrul modulului unde a fost definit, iesirile comandate de acest bloc sunt recalculate la orice modificare a unui semnal de intrare.&lt;br /&gt;
&lt;br /&gt;
În acest caz, putem reface implementarea sumatorului folosind un bloc &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    out = in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; secvențiale. Asignări non-blocante (non-blocking assignments) ====&lt;br /&gt;
&lt;br /&gt;
[[Circuite secvențiale|Circuitele secvențiale]] sunt circuitele care sunt sincronizate de [[Circuite secvențiale#Semnalul de ceas|semnalul de ceas]]. Acest semnal este, de obicei, produs de un generator de ceas și se definește ca intrare pentru fiecare modul secvențial (în care există cel puțin un registru). Putem modifica exemplul anterior, astfel încât ieșirea modulului de sumare să fie sincronă (adică să se modifice doar pe frontul pozitiv de ceas). Astfel, în interfața modulului, apare și semnalul de ceas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementation here&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Pentru descrierea circuitelor secvențiale, se folosește întotdeauna un bloc &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:SyncedAdder.png|thumb|Modulul SyncedAdder]]&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; descrie un circuit secvențial și are în lista de sensitivități, de obicei, doar semnalul de ceas. Acesta este sensibil la o tranziție a semnalului de ceas (numită front), de obicei cea din 0 în 1 (numită frontul pozitiv, sau frontul crescător al ceasului). Astfel, putem implementa sumatorul sincron în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    out &amp;lt;= in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Cuvântul cheie care specifică frontul pozitiv al unui semnal este &amp;#039;&amp;#039;&amp;#039;posedge&amp;#039;&amp;#039;&amp;#039;, iar cel pentru frontul negativ al semnalului este &amp;#039;&amp;#039;&amp;#039;negedge&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Observați operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; folosit pentru atribuirea sumei registrului destinație. Acesta NU este operatorul logic de &amp;#039;&amp;#039;mai mic sau egal&amp;#039;&amp;#039;, ci reprezintă un mod de atribuire care se numește non-blocantă. Diferența dintre atribuirea blocantă (&amp;#039;&amp;#039;&amp;#039;=&amp;#039;&amp;#039;&amp;#039;) și cea non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) este că cea de-a doua întâi evalueaza toate expresiile din partea dreaptă a operatorului de atribuire (în cazul de față, suma &amp;#039;&amp;#039;in0 + in1&amp;#039;&amp;#039;) și abia apoi asignează rezultatul registrului destinație. Spre exemplu, dacă dorim să inversăm valorile a două registre, &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; și &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;, astfel încât &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; să ia valoarea lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039; și invers, vom face în felul următor: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod corect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 &amp;lt;= reg1;&lt;br /&gt;
    reg1 &amp;lt;= reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modulul se va comporta conform așteptărilor. Operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; nu va bloca restul evaluărilor din blocul always și prin urmare toate asignările se fac simultan, după evaluarea expresiilor din partea dreaptă a operatorului. Pe de altă parte, dacă facem asignarea blocantă:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod incorect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 = reg1;&lt;br /&gt;
    reg1 = reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
aceasta va bloca restul operațiilor până când asignarea se termină. În acest caz, după primul front de ceas, ambele registre vor conține valoarea inițială a lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Operatorul de asignare non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) se folosește doar în blocuri &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; În același bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;, se folosește același tip de operator de asignare pentru toate operațiile. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Utilizați asignare non-blocantă pentru toate blocurile &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; care generează circuite secvențiale (sunt sincronizate de ceas) și asignare blocantă în toate celelalte cazuri. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri de instanțiere ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:adder4.png|thumb|Un sumator de patru numere format din trei sumatoare de două numere]]&lt;br /&gt;
&lt;br /&gt;
Odată definit un modul, acesta poate fi folosit de oricâte ori pe parcursul unuia sau mai multor proiecte. Acest sistem se numește instanțiere. Să luam, ca exemplu, un modul care trebuie să facă suma a 4 numere pe 3 biți. Putem să folosim în acest scop modulul &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; pe 4 biți definit mai sus, în configurația din figură. Observați că se utilizează același modul de trei ori. Este ineficient și inutil să scriem de trei ori implementarea modulului, așa că vom recurge la metoda instanțierii. Orice instanță a unui modul trebuie să aibă un nume unic, după cum și într-un limbaj de programare, variabilele de același fel trebuie sa aibă un nume unic.&lt;br /&gt;
&lt;br /&gt;
Se observă în continuare că există semnale (fire) în modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039;, care nu sunt nici intrări, nici ieșiri, și sunt folosite doar pentru conectarea modulelor &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; (cel roșu și cel verde). &lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru instanțierea unui modul este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
NumeModulInstantiat numeInstanta(&lt;br /&gt;
    .nume_intrare_sau_iesire_0(nume_semnal_legat_la_intrare_sau_iesire_0),&lt;br /&gt;
    .nume_intrare_sau_iesire_1(nume_semnal_legat_la_intrare_sau_iesire_1),&lt;br /&gt;
    //...&lt;br /&gt;
    .nume_intrare_sau_iesire_n(nume_semnal_legat_la_intrare_sau_iesire_n),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Codul SystemVerilog pentru modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039; este:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [3:0] subsum0;&lt;br /&gt;
logic [3:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0(in0),        //la intrarea numita in0 a instantei adder0 se leaga intrarea in0 a modulului&lt;br /&gt;
    .in1(in1)         //la intrarea numita in1 a instantei adder0 se leaga intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0(in2),        //la intrarea numita in0 a instantei adder1 se leaga intrarea in2 a modulului&lt;br /&gt;
    .in1(in3)         //la intrarea numita in1 a instantei adder1 se leaga intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),        //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0),    //la intrarea numita in0 a instantei adder2 se leaga firul subsum0&lt;br /&gt;
    .in1(subsum1)     //la intrarea numita in1 a instantei adder2 se leaga firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Instanțele adder0 și adder1 au legate la intrări semnale de 3 biți și la ieșiri fire de 4 biți, cu toate că porturile lor au 4, respectiv 5 biți (intrările și ieșirile). În acest caz, semnalele se leagă fiind aliniate la cel mai puțin semnificativ bit și se generează un mesaj de avertizare (port mismatch). Cu toate că programele folosite de noi acceptă codul de mai sus, există programe care nu acceptă astfel de construcții. Pentru a fi riguroși, vom folosi operatorul de concatenare pentru a corecta codul în felul următor (mai multe despre operatori veți putea afla mai jos):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3,&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [4:0] subsum0; //definim firele pe 5 biți deoarece iesirea instantelor adder0 si adder1 este pe 5 biti&lt;br /&gt;
logic [4:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0({1&amp;#039;b0,in0}), //la intrarea numita in0 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in0 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in1})  //la intrarea numita in1 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0({1&amp;#039;b0,in2}), //la intrarea numita in0 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in2 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in3})  //la intrarea numita in1 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),           //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0[3:0]),  //la intrarea numita in0 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum0&lt;br /&gt;
    .in1(subsum1[3:0])   //la intrarea numita in1 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module de test (nesintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
[[Fișier:addertester.png|thumb|Modul de test pentru sumatorul pe 4 biți]]&lt;br /&gt;
&lt;br /&gt;
Modulele de test sunt folosite pentru verificarea funcționalității unui alt modul sintetizabil. Figura alăturată prezintă schema bloc pentru un modul de test pentru sumatorul pe 4 biți. Un modul de test generic urmărește câteva reguli clare:&lt;br /&gt;
&lt;br /&gt;
* pentru fiecare intrare a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu intrarea, folosite pentru a genera stimuli pentru circuit;&lt;br /&gt;
* pentru fiecare ieșire a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu ieșirea, folosite pentru verificarea comportamentului (de obicei prin afișarea de forme de undă);&lt;br /&gt;
* se instanțiază modulul de testat și se leagă variabilele definite anterior la intrările și ieșirile instanței;&lt;br /&gt;
* se scrie un generator de stimuli (un bloc &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;) în care se programeaza o secvență temporizată de tranziții pentru intrări;&lt;br /&gt;
* se folosește un software de simulare pentru a rula testul și a vedea formele de undă.&lt;br /&gt;
&lt;br /&gt;
Astfel, modulul de test pentru sumatorul pe 4 biți va arăta astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AdderTester;&lt;br /&gt;
&lt;br /&gt;
//this is the definition of variables and wires&lt;br /&gt;
//for driving signals  &lt;br /&gt;
logic [3:0] i0;&lt;br /&gt;
logic [3:0] i1;&lt;br /&gt;
logic [4:0] o;&lt;br /&gt;
&lt;br /&gt;
//this is where the stimuls is added for the module&lt;br /&gt;
initial begin&lt;br /&gt;
     i0 = 0;&lt;br /&gt;
     i1 = 0;&lt;br /&gt;
  #5 i0 = 3;&lt;br /&gt;
  #2 i0 = 2;&lt;br /&gt;
     i1 = 1;&lt;br /&gt;
  #3 i0 = 1;&lt;br /&gt;
     i1 = 5;&lt;br /&gt;
  #5 $stop();&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
//this is where the tested module is instantiated  &lt;br /&gt;
Adder deviceUnderTest(&lt;br /&gt;
  .out(o),&lt;br /&gt;
  .in0(i0),&lt;br /&gt;
  .in1(i1)&lt;br /&gt;
);  &lt;br /&gt;
  &lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; este folosit pentru a da valori intrărilor modulului de testat. El iși începe execuția la momentul de timp t = 0. Fiecare linie este executată la același moment de tip, până când este întâlnit operatorul #, care așteaptă trecerea unor unități de timp. Astfel, în exemplul de mai sus, primele două linii se execută la t = 0, linia 3 se execută la t = 5, liniile 4 și 5 la t = 7, liniile 6 și 7 la t = 10 și ultima linie, la t = 15. Apelul funcției $stop() determină sfârșitul simulării.&lt;br /&gt;
&lt;br /&gt;
=== Semnalul de ceas în module de test ===&lt;br /&gt;
&lt;br /&gt;
Cuvântul cheie &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este folosit pentru a executa o atribuire sau apel de funcție în mod repetat, până la sfârșitul simulării. Acesta este în particular folositor pentru a genera un semnal de ceas. Secvența următoare de cod generează un semnal de ceas cu perioada de două unități de timp:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
reg clock;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock = 0;&lt;br /&gt;
    forever #1 clock = !clock;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Regulă:&amp;lt;/font&amp;gt;Pentru circuitele secvențiale, modulul de test va avea două blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. Primul este similar celui de mai sus, și utilizat pentru generarea semnalului de ceas. Al doilea este folosit pentru generarea celorlalte semnale de intrare și directivei de oprire a simulării. Motivul pentru această segregare este faptul că instrucțiunea &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este blocantă (adică instrucțiunile puse după ea nu se execută). Toate blocurile &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; dintr-un modul de test se execută în paralel.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sintaxa SystemVerilog ==&lt;br /&gt;
&lt;br /&gt;
=== Constante ===&lt;br /&gt;
&lt;br /&gt;
Constantele sunt valori numerice. Pentru fiecare valoare, se specifică numărul de biți pe care reprezentată si baza în care este scrisă. Spre exemplu &amp;#039;&amp;#039;&amp;#039;8&amp;#039;b111&amp;#039;&amp;#039;&amp;#039; este o constantă pe 8 biți a cărei valoare în binar este 111 (adică în decimal, 7). În același fel, &amp;#039;&amp;#039;&amp;#039;16&amp;#039;d10&amp;#039;&amp;#039;&amp;#039; reprezintă valoarea 10 în decimal reprezentată pe 16 biți. Este posibilă specificarea valorii fără număr de biți sau bază (în care caz baza implicită este cea decimală, și numărul de biți este aproximat de către compilator).&lt;br /&gt;
&lt;br /&gt;
=== Operatori ===&lt;br /&gt;
&lt;br /&gt;
==== Operatori aritmetici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Adunare || + || a + b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Scădere || - || a - b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Înmulțire || * || a * b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Împărțire || / || a / b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori logici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Egal || == || a == b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Diferit || != || a != b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic || &amp;lt; || a &amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic sau egal || &amp;lt;= || a &amp;lt;= b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare || &amp;gt; || a &amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare sau egal || &amp;gt;= || a &amp;gt;= b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori binari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și || &amp;amp; || a &amp;amp; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv || ^ || a ^ b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Operatori unari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Negare || ~ || ~b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și pe biții unui semnal|| &amp;amp; || &amp;amp;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau pe biții unui semnal|| &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv pe biții unui semnal|| ^ || ^a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori de shiftare pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la stânga  || &amp;lt;&amp;lt; || a &amp;lt;&amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la dreapta  || &amp;gt;&amp;gt; || a &amp;gt;&amp;gt; b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de acces la biți ====&lt;br /&gt;
&lt;br /&gt;
Dându-se un semnal pe n biți, operatorul de access la o sub-secvență din biții semnalului este &amp;#039;&amp;#039;&amp;#039;[m:k]&amp;#039;&amp;#039;&amp;#039; unde m și k sunt indecșii biților doriți, cu n &amp;lt; m &amp;lt; k. Ca exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [31:0] un_registru;&lt;br /&gt;
logic [7:0] un_fir;&lt;br /&gt;
logic alt_fir;&lt;br /&gt;
&lt;br /&gt;
assign un_fir = un_registru[30:23]; //firul &amp;quot;un_fir&amp;quot; ia valoarea data de secventa de biti de la 23 la 30 din registrul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
assign alt_fir = un_fir[3];         //firul &amp;quot;alt_fir&amp;quot; va lua valoarea bitului 3 din semnalul &amp;quot;un_fir&amp;quot; care este bitul 26 din semnalul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de concatenare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de concatenare este &amp;quot;{&amp;quot; și &amp;quot;}&amp;quot;. Astfel, o serie de semnale separate prin virgulă și închise între două acolade va rezulta într-un singur semnal de dimensiune egală cu suma dimensiunilor semnalelor componente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [3:0] a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic c;&lt;br /&gt;
logic [9:0] d;&lt;br /&gt;
&lt;br /&gt;
//semnalul d este format din concatenarea semnalelor a,b,c&lt;br /&gt;
//unde a este pe pozitia cea mai semnificativa si c&lt;br /&gt;
//pe pozitia cea mai putin semnificativa&lt;br /&gt;
assign d = {a,b,c};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de replicare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de replicare este folosit când se dorește replicarea unui semnal de un număr mare sau necunoscut de ori (dat ca parametru). Astfel, construcția &amp;#039;&amp;#039;&amp;#039;{n{m}}&amp;#039;&amp;#039;&amp;#039; reprezintă semnalul &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039;, multiplcat de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; ori.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic [7:0] c;&lt;br /&gt;
logic [15:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = {5{a}}; //b va lua valoarea data de a, replicata de 5 ori&lt;br /&gt;
assign d = {2{c}}; //d va lua valoarea lui c (8 biti) replicata de 2 ori&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Blocuri și operatori condiționali ===&lt;br /&gt;
&lt;br /&gt;
Condițiile se pot exprima în trei moduri:&lt;br /&gt;
* folosing operatorul condițional cunoscut din limbajul C (condiție &amp;#039;&amp;#039;&amp;#039;?&amp;#039;&amp;#039;&amp;#039; valoare_pentru_adevărat &amp;#039;&amp;#039;&amp;#039;:&amp;#039;&amp;#039;&amp;#039; valoare_pentru_fals);&lt;br /&gt;
* folosind construcția &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* folosind constructia &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; respectiv &amp;#039;&amp;#039;&amp;#039;casex - endcase&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;casez - endcase&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Operatorul condițional se poate utiliza în orice tip de bloc. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = a ? c : d; //daca a este adevarat (adica daca este egal cu 1), atunci b ia valoarea lui c, altfel, b ia valoarea lui d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocurile &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; se pot utiliza doar în blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    if(a) begin&lt;br /&gt;
        b = c;&lt;br /&gt;
    end else begin&lt;br /&gt;
        b = d;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemplu &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [1:0] a;&lt;br /&gt;
logic  [3:0] e;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
//daca a este egal cu 0, atunci e ia valoarea lui c&lt;br /&gt;
//daca a este egal cu 1, atunci e ia valoarea lui d&lt;br /&gt;
//in orice alt caz, b ia valoarea 0&lt;br /&gt;
always_comb begin&lt;br /&gt;
    case(a)&lt;br /&gt;
        2&amp;#039;b00: e = c;&lt;br /&gt;
        2&amp;#039;b01: e = d;&lt;br /&gt;
        default: e = 3&amp;#039;b000;&lt;br /&gt;
    endcase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7915</id>
		<title>SystemVerilog</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7915"/>
		<updated>2025-02-20T10:17:52Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Blocuri de instanțiere */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Module (sintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
Limbajul SystemVerilog este structurat pe module. Fiecare modul reprezintă un circuit care implementează o anume funcție. De exemplu, un modul poate reprezenta un sumator, adică un circuit care are două intrări ce specifică cei doi operanzi și o ieșire ce reprezintă rezultatul adunării. Conținutul modulului reprezintă descrierea (structurală sau comportamentală) a porților care calculeaza suma celor două intrări. Prin urmare, definiția unui modul SystemVerilog are două părți:&lt;br /&gt;
* interfață - lista tuturor porturilor de intrare și ieșire ale circuitului, specificate prin nume și dimensiune;&lt;br /&gt;
* implementare - descrierea efectivă a circuitului care se folosește de valorile de intrare pentru a calcula valorile de ieșire;&lt;br /&gt;
&lt;br /&gt;
=== Interfața modulelor SystemVerilog ===&lt;br /&gt;
Interfața modulului &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; este prezentată mai jos. &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ca și în sistemul numeral zecimal, unde suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; cifre are nevoie de &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; cifre (9 + 9 = 18), și în sistemul binar, suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; biți va fi pe &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; biți.&lt;br /&gt;
[[Fișier:Adder_interface.svg|thumb|Reprezentarea interfetei modulului &amp;quot;Adder&amp;quot; (black box)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Cuvintele cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;endmodule&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; sunt folosite pentru a începe și a încheia definirea unui modul. Imediat după cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; urmează numele modulului. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Numele unui modul va începe cu literă mare.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După definirea numelui modulului, urmează lista de porturi, plasată între &amp;#039;&amp;#039;&amp;#039;paranteze rotunde&amp;#039;&amp;#039;&amp;#039; și separate prin &amp;#039;&amp;#039;&amp;#039;virgulă&amp;#039;&amp;#039;&amp;#039;. Cuvintele cheie acceptate sunt &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;output&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de ieșire), &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;input&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de intrare) și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port bidirecțional).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AA00&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Când aveți de ales în privința interfeței unui modul, se evită utilizarea semnalelor de tip &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;. Acestea introduc elemente de tip [http://en.wikipedia.org/wiki/Tri-state_buffer#Tri-state_Buffer Tri-state Buffer] care sunt ineficiente. O alternativă mai eficientă este definirea a două porturi, unul de intrare și unul de ieșire, cu nume similare (ex: &amp;#039;&amp;#039;data_in&amp;#039;&amp;#039; și &amp;#039;&amp;#039;data_out&amp;#039;&amp;#039;).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Întâi se definesc ieșirile, apoi intrările unui modul.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Porturile unui modul se scriu unul sub altul, pe câte o linie, aliniate cu un tab la dreapta față de cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După tipul portului, urmează dimensiunea acestuia, specificată în indecșii biților, unde cel mai puțin semnificativ bit are indexul 0. Spre exemplu, un semnal de 4 biți va avea următoarea specificație &amp;#039;&amp;#039;&amp;#039;[3:0]&amp;#039;&amp;#039;&amp;#039; (bitul cel mai semnificativ are indexul 3, cel mai puțin semnificativ 0, în total 4 biți). &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Semnalelor de un bit le lipsește specificația de dimensiune:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
input semnal_de_un_bit,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După lista de porturi aflată între paranteze, definirea interfeței se termină cu caracterul &amp;#039;&amp;#039;&amp;#039;;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Există module nesintetizabile (care nu au corespondent in porți logice), care sunt folosite ca &amp;quot;programe&amp;quot; de test în medii de simulare și se numesc module de test. Aceste module nu au porturi de intrare și ieșire și sunt utilizate doar pentru a da valori porturilor de intrare ale modulului care se testează, și de a verifica valorile de pe porturile de ieșire ale acestuia. În cazul acestor module, lista de porturi și parantezele rotunde aferente lipsesc:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module TestModule;&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementarea modulelor SystemVerilog ===&lt;br /&gt;
&lt;br /&gt;
Implementarea modulelor SystemVerilog se face prin blocuri. Aceste blocuri pot avea sau nu corespondent într-un ciruit fizic. Dacă toate blocurile unui modul au corespondent într-un circuit fizic, atunci modulul este sintetizabil și poate fi transformat într-un circuit fizic. Blocurile care pot genera construcții sintetizabile sunt de patru tipuri:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri de instanțiere&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;generate&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Blocurile care sunt întotdeauna nesintetizabile și sunt folosite exclusiv pentru simulare:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Nu orice bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; este sintetizabil. Există construcții valide sintactic dar care nu au corespondent unui circuit. Aceste blocuri pot fi simulate, dar nu pot fi utilizate pentru programarea unei plăci [[FPGA]].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ordinea blocurilor într-un modul nu contează.&lt;br /&gt;
&lt;br /&gt;
==== Cuvântul cheie &amp;quot;logic&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
In SystemVerilog, toate semnalele sunt de tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, indiferent de natura lor. În urma sintezei, semnalele vor deveni fire, latch-uri sau registre.&lt;br /&gt;
&lt;br /&gt;
Semnalele într-un modul SystemVerilog se definesc în felul următor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
logic [3:0] semnal;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Niciun element nu își poate schimba valoarea în mai mult de un bloc.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Adder.png|thumb|Modulul Adder implementat]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assign&amp;#039;&amp;#039;&amp;#039; este un cuvănt cheie care generează [[circuite combinaționale]]. Cum sumatorul este un [[circuite combinaționale|circuit combinațional]], îl putem implementa cu un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign out = in0 + in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; În general, un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; va genera un circuit sintetizabil. Există și excepții, atunci când operația dorită este prea complexă pentru a fi implementată printr-un circuit combinațional, în mod eficient. Spre exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
assign out = in0 / in1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nu este un cod sintetizabil pentru majoritatea tool-urilor de sinteză, dar funcționează perfect într-o simulare.&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinaționale ====&lt;br /&gt;
&lt;br /&gt;
Formatul pentru un bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinational este următorul:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    //...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un bloc de tip &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; este sensibil la modificare oricarui semnal din cadrul modulului unde a fost definit, iesirile comandate de acest bloc sunt recalculate la orice modificare a unui semnal de intrare.&lt;br /&gt;
&lt;br /&gt;
În acest caz, putem reface implementarea sumatorului folosind un bloc &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    out = in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; secvențiale. Asignări non-blocante (non-blocking assignments) ====&lt;br /&gt;
&lt;br /&gt;
[[Circuite secvențiale|Circuitele secvențiale]] sunt circuitele care sunt sincronizate de [[Circuite secvențiale#Semnalul de ceas|semnalul de ceas]]. Acest semnal este, de obicei, produs de un generator de ceas și se definește ca intrare pentru fiecare modul secvențial (în care există cel puțin un registru). Putem modifica exemplul anterior, astfel încât ieșirea modulului de sumare să fie sincronă (adică să se modifice doar pe frontul pozitiv de ceas). Astfel, în interfața modulului, apare și semnalul de ceas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementation here&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Pentru descrierea circuitelor secvențiale, se folosește întotdeauna un bloc &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:SyncedAdder.png|thumb|Modulul SyncedAdder]]&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; descrie un circuit secvențial și are în lista de sensitivități, de obicei, doar semnalul de ceas. Acesta este sensibil la o tranziție a semnalului de ceas (numită front), de obicei cea din 0 în 1 (numită frontul pozitiv, sau frontul crescător al ceasului). Astfel, putem implementa sumatorul sincron în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    out &amp;lt;= in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Cuvântul cheie care specifică frontul pozitiv al unui semnal este &amp;#039;&amp;#039;&amp;#039;posedge&amp;#039;&amp;#039;&amp;#039;, iar cel pentru frontul negativ al semnalului este &amp;#039;&amp;#039;&amp;#039;negedge&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Observați operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; folosit pentru atribuirea sumei registrului destinație. Acesta NU este operatorul logic de &amp;#039;&amp;#039;mai mic sau egal&amp;#039;&amp;#039;, ci reprezintă un mod de atribuire care se numește non-blocantă. Diferența dintre atribuirea blocantă (&amp;#039;&amp;#039;&amp;#039;=&amp;#039;&amp;#039;&amp;#039;) și cea non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) este că cea de-a doua întâi evalueaza toate expresiile din partea dreaptă a operatorului de atribuire (în cazul de față, suma &amp;#039;&amp;#039;in0 + in1&amp;#039;&amp;#039;) și abia apoi asignează rezultatul registrului destinație. Spre exemplu, dacă dorim să inversăm valorile a două registre, &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; și &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;, astfel încât &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; să ia valoarea lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039; și invers, vom face în felul următor: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod corect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 &amp;lt;= reg1;&lt;br /&gt;
    reg1 &amp;lt;= reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modulul se va comporta conform așteptărilor. Operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; nu va bloca restul evaluărilor din blocul always și prin urmare toate asignările se fac simultan, după evaluarea expresiilor din partea dreaptă a operatorului. Pe de altă parte, dacă facem asignarea blocantă:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod incorect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 = reg1;&lt;br /&gt;
    reg1 = reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
aceasta va bloca restul operațiilor până când asignarea se termină. În acest caz, după primul front de ceas, ambele registre vor conține valoarea inițială a lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Operatorul de asignare non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) se folosește doar în blocuri &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; În același bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;, se folosește același tip de operator de asignare pentru toate operațiile. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Utilizați asignare non-blocantă pentru toate blocurile &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; care generează circuite secvențiale (sunt sincronizate de ceas) și asignare blocantă în toate celelalte cazuri. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri de instanțiere ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:adder4.png|thumb|Un sumator de patru numere format din trei sumatoare de două numere]]&lt;br /&gt;
&lt;br /&gt;
Odată definit un modul, acesta poate fi folosit de oricâte ori pe parcursul unuia sau mai multor proiecte. Acest sistem se numește instanțiere. Să luam, ca exemplu, un modul care trebuie să facă suma a 4 numere pe 3 biți. Putem să folosim în acest scop modulul &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; pe 4 biți definit mai sus, în configurația din figură. Observați că se utilizează același modul de trei ori. Este ineficient și inutil să scriem de trei ori implementarea modulului, așa că vom recurge la metoda instanțierii. Orice instanță a unui modul trebuie să aibă un nume unic, după cum și într-un limbaj de programare, variabilele de același fel trebuie sa aibă un nume unic.&lt;br /&gt;
&lt;br /&gt;
Se observă în continuare că există semnale (fire) în modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039;, care nu sunt nici intrări, nici ieșiri, și sunt folosite doar pentru conectarea modulelor &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; (cel roșu și cel verde). &lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru instanțierea unui modul este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
NumeModulInstantiat numeInstanta(&lt;br /&gt;
    .nume_intrare_sau_iesire_0(nume_semnal_legat_la_intrare_sau_iesire_0),&lt;br /&gt;
    .nume_intrare_sau_iesire_1(nume_semnal_legat_la_intrare_sau_iesire_1),&lt;br /&gt;
    //...&lt;br /&gt;
    .nume_intrare_sau_iesire_n(nume_semnal_legat_la_intrare_sau_iesire_n),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Codul SystemVerilog pentru modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039; este:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [3:0] subsum0;&lt;br /&gt;
logic [3:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0(in0),        //la intrarea numita in0 a instantei adder0 se leaga intrarea in0 a modulului&lt;br /&gt;
    .in1(in1)         //la intrarea numita in1 a instantei adder0 se leaga intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0(in2),        //la intrarea numita in0 a instantei adder1 se leaga intrarea in2 a modulului&lt;br /&gt;
    .in1(in3)         //la intrarea numita in1 a instantei adder1 se leaga intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),        //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0),    //la intrarea numita in0 a instantei adder2 se leaga firul subsum0&lt;br /&gt;
    .in1(subsum1)     //la intrarea numita in1 a instantei adder2 se leaga firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Instanțele adder0 și adder1 au legate la intrări semnale de 3 biți și la ieșiri fire de 4 biți, cu toate că porturile lor au 4, respectiv 5 biți (intrările și ieșirile). În acest caz, semnalele se leagă fiind aliniate la cel mai puțin semnificativ bit și se generează un mesaj de avertizare (port mismatch). Cu toate că programele folosite de noi acceptă codul de mai sus, există programe care nu acceptă astfel de construcții și se returnează erori. Ca să fim riguroși, vom folosi operatorul de concatenare pentru a corecta codul în felul următor (mai multe despre operatori veți putea afla mai jos):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3,&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [4:0] subsum0; //definim firele pe 5 biți deoarece iesirea instantelor adder0 si adder1 este pe 5 biti&lt;br /&gt;
logic [4:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0({1&amp;#039;b0,in0}), //la intrarea numita in0 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in0 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in1})  //la intrarea numita in1 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0({1&amp;#039;b0,in2}), //la intrarea numita in0 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in2 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in3})  //la intrarea numita in1 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),           //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0[3:0]),  //la intrarea numita in0 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum0&lt;br /&gt;
    .in1(subsum1[3:0])   //la intrarea numita in1 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module de test (nesintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
[[Fișier:addertester.png|thumb|Modul de test pentru sumatorul pe 4 biți]]&lt;br /&gt;
&lt;br /&gt;
Modulele de test sunt folosite pentru verificarea funcționalității unui alt modul sintetizabil. Figura alăturată prezintă schema bloc pentru un modul de test pentru sumatorul pe 4 biți. Un modul de test generic urmărește câteva reguli clare:&lt;br /&gt;
&lt;br /&gt;
* pentru fiecare intrare a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu intrarea, folosite pentru a genera stimuli pentru circuit;&lt;br /&gt;
* pentru fiecare ieșire a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu ieșirea, folosite pentru verificarea comportamentului (de obicei prin afișarea de forme de undă);&lt;br /&gt;
* se instanțiază modulul de testat și se leagă variabilele definite anterior la intrările și ieșirile instanței;&lt;br /&gt;
* se scrie un generator de stimuli (un bloc &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;) în care se programeaza o secvență temporizată de tranziții pentru intrări;&lt;br /&gt;
* se folosește un software de simulare pentru a rula testul și a vedea formele de undă.&lt;br /&gt;
&lt;br /&gt;
Astfel, modulul de test pentru sumatorul pe 4 biți va arăta astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AdderTester;&lt;br /&gt;
&lt;br /&gt;
//this is the definition of variables and wires&lt;br /&gt;
//for driving signals  &lt;br /&gt;
logic [3:0] i0;&lt;br /&gt;
logic [3:0] i1;&lt;br /&gt;
logic [4:0] o;&lt;br /&gt;
&lt;br /&gt;
//this is where the stimuls is added for the module&lt;br /&gt;
initial begin&lt;br /&gt;
     i0 = 0;&lt;br /&gt;
     i1 = 0;&lt;br /&gt;
  #5 i0 = 3;&lt;br /&gt;
  #2 i0 = 2;&lt;br /&gt;
     i1 = 1;&lt;br /&gt;
  #3 i0 = 1;&lt;br /&gt;
     i1 = 5;&lt;br /&gt;
  #5 $stop();&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
//this is where the tested module is instantiated  &lt;br /&gt;
Adder deviceUnderTest(&lt;br /&gt;
  .out(o),&lt;br /&gt;
  .in0(i0),&lt;br /&gt;
  .in1(i1)&lt;br /&gt;
);  &lt;br /&gt;
  &lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; este folosit pentru a da valori intrărilor modulului de testat. El iși începe execuția la momentul de timp t = 0. Fiecare linie este executată la același moment de tip, până când este întâlnit operatorul #, care așteaptă trecerea unor unități de timp. Astfel, în exemplul de mai sus, primele două linii se execută la t = 0, linia 3 se execută la t = 5, liniile 4 și 5 la t = 7, liniile 6 și 7 la t = 10 și ultima linie, la t = 15. Apelul funcției $stop() determină sfârșitul simulării.&lt;br /&gt;
&lt;br /&gt;
=== Semnalul de ceas în module de test ===&lt;br /&gt;
&lt;br /&gt;
Cuvântul cheie &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este folosit pentru a executa o atribuire sau apel de funcție în mod repetat, până la sfârșitul simulării. Acesta este în particular folositor pentru a genera un semnal de ceas. Secvența următoare de cod generează un semnal de ceas cu perioada de două unități de timp:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
reg clock;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock = 0;&lt;br /&gt;
    forever #1 clock = !clock;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Regulă:&amp;lt;/font&amp;gt;Pentru circuitele secvențiale, modulul de test va avea două blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. Primul este similar celui de mai sus, și utilizat pentru generarea semnalului de ceas. Al doilea este folosit pentru generarea celorlalte semnale de intrare și directivei de oprire a simulării. Motivul pentru această segregare este faptul că instrucțiunea &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este blocantă (adică instrucțiunile puse după ea nu se execută). Toate blocurile &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; dintr-un modul de test se execută în paralel.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sintaxa SystemVerilog ==&lt;br /&gt;
&lt;br /&gt;
=== Constante ===&lt;br /&gt;
&lt;br /&gt;
Constantele sunt valori numerice. Pentru fiecare valoare, se specifică numărul de biți pe care reprezentată si baza în care este scrisă. Spre exemplu &amp;#039;&amp;#039;&amp;#039;8&amp;#039;b111&amp;#039;&amp;#039;&amp;#039; este o constantă pe 8 biți a cărei valoare în binar este 111 (adică în decimal, 7). În același fel, &amp;#039;&amp;#039;&amp;#039;16&amp;#039;d10&amp;#039;&amp;#039;&amp;#039; reprezintă valoarea 10 în decimal reprezentată pe 16 biți. Este posibilă specificarea valorii fără număr de biți sau bază (în care caz baza implicită este cea decimală, și numărul de biți este aproximat de către compilator).&lt;br /&gt;
&lt;br /&gt;
=== Operatori ===&lt;br /&gt;
&lt;br /&gt;
==== Operatori aritmetici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Adunare || + || a + b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Scădere || - || a - b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Înmulțire || * || a * b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Împărțire || / || a / b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori logici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Egal || == || a == b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Diferit || != || a != b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic || &amp;lt; || a &amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic sau egal || &amp;lt;= || a &amp;lt;= b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare || &amp;gt; || a &amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare sau egal || &amp;gt;= || a &amp;gt;= b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori binari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și || &amp;amp; || a &amp;amp; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv || ^ || a ^ b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Operatori unari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Negare || ~ || ~b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și pe biții unui semnal|| &amp;amp; || &amp;amp;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau pe biții unui semnal|| &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv pe biții unui semnal|| ^ || ^a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori de shiftare pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la stânga  || &amp;lt;&amp;lt; || a &amp;lt;&amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la dreapta  || &amp;gt;&amp;gt; || a &amp;gt;&amp;gt; b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de acces la biți ====&lt;br /&gt;
&lt;br /&gt;
Dându-se un semnal pe n biți, operatorul de access la o sub-secvență din biții semnalului este &amp;#039;&amp;#039;&amp;#039;[m:k]&amp;#039;&amp;#039;&amp;#039; unde m și k sunt indecșii biților doriți, cu n &amp;lt; m &amp;lt; k. Ca exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [31:0] un_registru;&lt;br /&gt;
logic [7:0] un_fir;&lt;br /&gt;
logic alt_fir;&lt;br /&gt;
&lt;br /&gt;
assign un_fir = un_registru[30:23]; //firul &amp;quot;un_fir&amp;quot; ia valoarea data de secventa de biti de la 23 la 30 din registrul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
assign alt_fir = un_fir[3];         //firul &amp;quot;alt_fir&amp;quot; va lua valoarea bitului 3 din semnalul &amp;quot;un_fir&amp;quot; care este bitul 26 din semnalul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de concatenare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de concatenare este &amp;quot;{&amp;quot; și &amp;quot;}&amp;quot;. Astfel, o serie de semnale separate prin virgulă și închise între două acolade va rezulta într-un singur semnal de dimensiune egală cu suma dimensiunilor semnalelor componente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [3:0] a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic c;&lt;br /&gt;
logic [9:0] d;&lt;br /&gt;
&lt;br /&gt;
//semnalul d este format din concatenarea semnalelor a,b,c&lt;br /&gt;
//unde a este pe pozitia cea mai semnificativa si c&lt;br /&gt;
//pe pozitia cea mai putin semnificativa&lt;br /&gt;
assign d = {a,b,c};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de replicare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de replicare este folosit când se dorește replicarea unui semnal de un număr mare sau necunoscut de ori (dat ca parametru). Astfel, construcția &amp;#039;&amp;#039;&amp;#039;{n{m}}&amp;#039;&amp;#039;&amp;#039; reprezintă semnalul &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039;, multiplcat de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; ori.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic [7:0] c;&lt;br /&gt;
logic [15:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = {5{a}}; //b va lua valoarea data de a, replicata de 5 ori&lt;br /&gt;
assign d = {2{c}}; //d va lua valoarea lui c (8 biti) replicata de 2 ori&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Blocuri și operatori condiționali ===&lt;br /&gt;
&lt;br /&gt;
Condițiile se pot exprima în trei moduri:&lt;br /&gt;
* folosing operatorul condițional cunoscut din limbajul C (condiție &amp;#039;&amp;#039;&amp;#039;?&amp;#039;&amp;#039;&amp;#039; valoare_pentru_adevărat &amp;#039;&amp;#039;&amp;#039;:&amp;#039;&amp;#039;&amp;#039; valoare_pentru_fals);&lt;br /&gt;
* folosind construcția &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* folosind constructia &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; respectiv &amp;#039;&amp;#039;&amp;#039;casex - endcase&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;casez - endcase&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Operatorul condițional se poate utiliza în orice tip de bloc. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = a ? c : d; //daca a este adevarat (adica daca este egal cu 1), atunci b ia valoarea lui c, altfel, b ia valoarea lui d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocurile &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; se pot utiliza doar în blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    if(a) begin&lt;br /&gt;
        b = c;&lt;br /&gt;
    end else begin&lt;br /&gt;
        b = d;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemplu &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [1:0] a;&lt;br /&gt;
logic  [3:0] e;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
//daca a este egal cu 0, atunci e ia valoarea lui c&lt;br /&gt;
//daca a este egal cu 1, atunci e ia valoarea lui d&lt;br /&gt;
//in orice alt caz, b ia valoarea 0&lt;br /&gt;
always_comb begin&lt;br /&gt;
    case(a)&lt;br /&gt;
        2&amp;#039;b00: e = c;&lt;br /&gt;
        2&amp;#039;b01: e = d;&lt;br /&gt;
        default: e = 3&amp;#039;b000;&lt;br /&gt;
    endcase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7914</id>
		<title>SystemVerilog</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7914"/>
		<updated>2025-02-20T10:14:15Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Blocuri de instanțiere */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Module (sintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
Limbajul SystemVerilog este structurat pe module. Fiecare modul reprezintă un circuit care implementează o anume funcție. De exemplu, un modul poate reprezenta un sumator, adică un circuit care are două intrări ce specifică cei doi operanzi și o ieșire ce reprezintă rezultatul adunării. Conținutul modulului reprezintă descrierea (structurală sau comportamentală) a porților care calculeaza suma celor două intrări. Prin urmare, definiția unui modul SystemVerilog are două părți:&lt;br /&gt;
* interfață - lista tuturor porturilor de intrare și ieșire ale circuitului, specificate prin nume și dimensiune;&lt;br /&gt;
* implementare - descrierea efectivă a circuitului care se folosește de valorile de intrare pentru a calcula valorile de ieșire;&lt;br /&gt;
&lt;br /&gt;
=== Interfața modulelor SystemVerilog ===&lt;br /&gt;
Interfața modulului &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; este prezentată mai jos. &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ca și în sistemul numeral zecimal, unde suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; cifre are nevoie de &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; cifre (9 + 9 = 18), și în sistemul binar, suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; biți va fi pe &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; biți.&lt;br /&gt;
[[Fișier:Adder_interface.svg|thumb|Reprezentarea interfetei modulului &amp;quot;Adder&amp;quot; (black box)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Cuvintele cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;endmodule&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; sunt folosite pentru a începe și a încheia definirea unui modul. Imediat după cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; urmează numele modulului. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Numele unui modul va începe cu literă mare.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După definirea numelui modulului, urmează lista de porturi, plasată între &amp;#039;&amp;#039;&amp;#039;paranteze rotunde&amp;#039;&amp;#039;&amp;#039; și separate prin &amp;#039;&amp;#039;&amp;#039;virgulă&amp;#039;&amp;#039;&amp;#039;. Cuvintele cheie acceptate sunt &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;output&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de ieșire), &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;input&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de intrare) și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port bidirecțional).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AA00&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Când aveți de ales în privința interfeței unui modul, se evită utilizarea semnalelor de tip &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;. Acestea introduc elemente de tip [http://en.wikipedia.org/wiki/Tri-state_buffer#Tri-state_Buffer Tri-state Buffer] care sunt ineficiente. O alternativă mai eficientă este definirea a două porturi, unul de intrare și unul de ieșire, cu nume similare (ex: &amp;#039;&amp;#039;data_in&amp;#039;&amp;#039; și &amp;#039;&amp;#039;data_out&amp;#039;&amp;#039;).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Întâi se definesc ieșirile, apoi intrările unui modul.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Porturile unui modul se scriu unul sub altul, pe câte o linie, aliniate cu un tab la dreapta față de cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După tipul portului, urmează dimensiunea acestuia, specificată în indecșii biților, unde cel mai puțin semnificativ bit are indexul 0. Spre exemplu, un semnal de 4 biți va avea următoarea specificație &amp;#039;&amp;#039;&amp;#039;[3:0]&amp;#039;&amp;#039;&amp;#039; (bitul cel mai semnificativ are indexul 3, cel mai puțin semnificativ 0, în total 4 biți). &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Semnalelor de un bit le lipsește specificația de dimensiune:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
input semnal_de_un_bit,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După lista de porturi aflată între paranteze, definirea interfeței se termină cu caracterul &amp;#039;&amp;#039;&amp;#039;;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Există module nesintetizabile (care nu au corespondent in porți logice), care sunt folosite ca &amp;quot;programe&amp;quot; de test în medii de simulare și se numesc module de test. Aceste module nu au porturi de intrare și ieșire și sunt utilizate doar pentru a da valori porturilor de intrare ale modulului care se testează, și de a verifica valorile de pe porturile de ieșire ale acestuia. În cazul acestor module, lista de porturi și parantezele rotunde aferente lipsesc:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module TestModule;&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementarea modulelor SystemVerilog ===&lt;br /&gt;
&lt;br /&gt;
Implementarea modulelor SystemVerilog se face prin blocuri. Aceste blocuri pot avea sau nu corespondent într-un ciruit fizic. Dacă toate blocurile unui modul au corespondent într-un circuit fizic, atunci modulul este sintetizabil și poate fi transformat într-un circuit fizic. Blocurile care pot genera construcții sintetizabile sunt de patru tipuri:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri de instanțiere&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;generate&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Blocurile care sunt întotdeauna nesintetizabile și sunt folosite exclusiv pentru simulare:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Nu orice bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; este sintetizabil. Există construcții valide sintactic dar care nu au corespondent unui circuit. Aceste blocuri pot fi simulate, dar nu pot fi utilizate pentru programarea unei plăci [[FPGA]].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ordinea blocurilor într-un modul nu contează.&lt;br /&gt;
&lt;br /&gt;
==== Cuvântul cheie &amp;quot;logic&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
In SystemVerilog, toate semnalele sunt de tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, indiferent de natura lor. În urma sintezei, semnalele vor deveni fire, latch-uri sau registre.&lt;br /&gt;
&lt;br /&gt;
Semnalele într-un modul SystemVerilog se definesc în felul următor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
logic [3:0] semnal;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Niciun element nu își poate schimba valoarea în mai mult de un bloc.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Adder.png|thumb|Modulul Adder implementat]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assign&amp;#039;&amp;#039;&amp;#039; este un cuvănt cheie care generează [[circuite combinaționale]]. Cum sumatorul este un [[circuite combinaționale|circuit combinațional]], îl putem implementa cu un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign out = in0 + in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; În general, un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; va genera un circuit sintetizabil. Există și excepții, atunci când operația dorită este prea complexă pentru a fi implementată printr-un circuit combinațional, în mod eficient. Spre exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
assign out = in0 / in1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nu este un cod sintetizabil pentru majoritatea tool-urilor de sinteză, dar funcționează perfect într-o simulare.&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinaționale ====&lt;br /&gt;
&lt;br /&gt;
Formatul pentru un bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinational este următorul:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    //...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un bloc de tip &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; este sensibil la modificare oricarui semnal din cadrul modulului unde a fost definit, iesirile comandate de acest bloc sunt recalculate la orice modificare a unui semnal de intrare.&lt;br /&gt;
&lt;br /&gt;
În acest caz, putem reface implementarea sumatorului folosind un bloc &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    out = in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; secvențiale. Asignări non-blocante (non-blocking assignments) ====&lt;br /&gt;
&lt;br /&gt;
[[Circuite secvențiale|Circuitele secvențiale]] sunt circuitele care sunt sincronizate de [[Circuite secvențiale#Semnalul de ceas|semnalul de ceas]]. Acest semnal este, de obicei, produs de un generator de ceas și se definește ca intrare pentru fiecare modul secvențial (în care există cel puțin un registru). Putem modifica exemplul anterior, astfel încât ieșirea modulului de sumare să fie sincronă (adică să se modifice doar pe frontul pozitiv de ceas). Astfel, în interfața modulului, apare și semnalul de ceas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementation here&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Pentru descrierea circuitelor secvențiale, se folosește întotdeauna un bloc &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:SyncedAdder.png|thumb|Modulul SyncedAdder]]&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; descrie un circuit secvențial și are în lista de sensitivități, de obicei, doar semnalul de ceas. Acesta este sensibil la o tranziție a semnalului de ceas (numită front), de obicei cea din 0 în 1 (numită frontul pozitiv, sau frontul crescător al ceasului). Astfel, putem implementa sumatorul sincron în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    out &amp;lt;= in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Cuvântul cheie care specifică frontul pozitiv al unui semnal este &amp;#039;&amp;#039;&amp;#039;posedge&amp;#039;&amp;#039;&amp;#039;, iar cel pentru frontul negativ al semnalului este &amp;#039;&amp;#039;&amp;#039;negedge&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Observați operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; folosit pentru atribuirea sumei registrului destinație. Acesta NU este operatorul logic de &amp;#039;&amp;#039;mai mic sau egal&amp;#039;&amp;#039;, ci reprezintă un mod de atribuire care se numește non-blocantă. Diferența dintre atribuirea blocantă (&amp;#039;&amp;#039;&amp;#039;=&amp;#039;&amp;#039;&amp;#039;) și cea non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) este că cea de-a doua întâi evalueaza toate expresiile din partea dreaptă a operatorului de atribuire (în cazul de față, suma &amp;#039;&amp;#039;in0 + in1&amp;#039;&amp;#039;) și abia apoi asignează rezultatul registrului destinație. Spre exemplu, dacă dorim să inversăm valorile a două registre, &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; și &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;, astfel încât &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; să ia valoarea lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039; și invers, vom face în felul următor: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod corect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 &amp;lt;= reg1;&lt;br /&gt;
    reg1 &amp;lt;= reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modulul se va comporta conform așteptărilor. Operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; nu va bloca restul evaluărilor din blocul always și prin urmare toate asignările se fac simultan, după evaluarea expresiilor din partea dreaptă a operatorului. Pe de altă parte, dacă facem asignarea blocantă:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod incorect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 = reg1;&lt;br /&gt;
    reg1 = reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
aceasta va bloca restul operațiilor până când asignarea se termină. În acest caz, după primul front de ceas, ambele registre vor conține valoarea inițială a lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Operatorul de asignare non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) se folosește doar în blocuri &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; În același bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;, se folosește același tip de operator de asignare pentru toate operațiile. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Utilizați asignare non-blocantă pentru toate blocurile &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; care generează circuite secvențiale (sunt sincronizate de ceas) și asignare blocantă în toate celelalte cazuri. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri de instanțiere ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:adder4.png|thumb|Un sumator de patru numere format din trei sumatoare de două numere]]&lt;br /&gt;
&lt;br /&gt;
Odată definit un modul, acesta poate fi folosit de oricâte ori pe parcursul unuia sau mai multor proiecte. Acest sistem se numește instanțiere. Să luam, ca exemplu, un modul care trebuie să facă suma a 4 numere pe 3 biți. Putem să folosim în acest scop modulul &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; pe 4 biți definit mai sus, în configurația din figură. Observați că se utilizează același modul de trei ori. Este ineficient și inutil să scriem de trei ori implementarea modulului, așa că vom recurge la metoda instanțierii. Orice instanță a unui modul trebuie să aibă un nume unic, după cum și într-un limbaj de programare, variabilele de același fel trebuie sa aibă un nume unic.&lt;br /&gt;
&lt;br /&gt;
Se observă în continuare că există semnale (fire) în modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039;, care nu sunt nici intrări, nici ieșiri, și sunt folosite doar pentru conectarea modulelor &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; (cel roșu și cel verde). &lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru instanțierea unui modul este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
NumeModulInstantiat numeInstanta(&lt;br /&gt;
    .nume_intrare_sau_iesire_0(nume_semnal_legat_la_intrare_sau_iesire_0),&lt;br /&gt;
    .nume_intrare_sau_iesire_1(nume_semnal_legat_la_intrare_sau_iesire_1),&lt;br /&gt;
    //...&lt;br /&gt;
    .nume_intrare_sau_iesire_n(nume_semnal_legat_la_intrare_sau_iesire_n),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Codul SystemVerilog pentru modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039; este:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [3:0] subsum0;&lt;br /&gt;
logic [3:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0(in0),        //la intrarea numita in0 a instantei adder0 se leaga intrarea in0 a modulului&lt;br /&gt;
    .in1(in1)         //la intrarea numita in1 a instantei adder0 se leaga intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0(in2),        //la intrarea numita in0 a instantei adder1 se leaga intrarea in2 a modulului&lt;br /&gt;
    .in1(in3)         //la intrarea numita in1 a instantei adder1 se leaga intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),        //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0),    //la intrarea numita in0 a instantei adder2 se leaga firul subsum0&lt;br /&gt;
    .in1(subsum1)     //la intrarea numita in1 a instantei adder2 se leaga firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Instanțele adder0 și adder1 au legate la intrări semnale de 3 biți și la ieșire legate fire de 4 biți, cu toate că porturile lor au 4, respectiv 5 biți (intrările și ieșirile). În acest caz, semnalele se leagă fiind aliniate la cel mai puțin semnificativ bit și se generează un mesaj de avertizare (port mismatch). Cu toate că programele folosite de noi acceptă codul de mai sus, există programe care nu acceptă astfel de construcții, și se opresc cu erori. Ca să fim foarte riguroși, vom folosi operatorul de concatenare pentru a corecta codul în felul următor (mai multe despre operatori veți putea afla mai jos):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3,&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [4:0] subsum0; //definim firele pe 5 biți deoarece iesirea instantelor adder0 si adder1 este pe 5 biti&lt;br /&gt;
logic [4:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0({1&amp;#039;b0,in0}), //la intrarea numita in0 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in0 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in1})  //la intrarea numita in1 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0({1&amp;#039;b0,in2}), //la intrarea numita in0 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in2 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in3})  //la intrarea numita in1 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),           //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0[3:0]),  //la intrarea numita in0 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum0&lt;br /&gt;
    .in1(subsum1[3:0])   //la intrarea numita in1 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module de test (nesintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
[[Fișier:addertester.png|thumb|Modul de test pentru sumatorul pe 4 biți]]&lt;br /&gt;
&lt;br /&gt;
Modulele de test sunt folosite pentru verificarea funcționalității unui alt modul sintetizabil. Figura alăturată prezintă schema bloc pentru un modul de test pentru sumatorul pe 4 biți. Un modul de test generic urmărește câteva reguli clare:&lt;br /&gt;
&lt;br /&gt;
* pentru fiecare intrare a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu intrarea, folosite pentru a genera stimuli pentru circuit;&lt;br /&gt;
* pentru fiecare ieșire a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu ieșirea, folosite pentru verificarea comportamentului (de obicei prin afișarea de forme de undă);&lt;br /&gt;
* se instanțiază modulul de testat și se leagă variabilele definite anterior la intrările și ieșirile instanței;&lt;br /&gt;
* se scrie un generator de stimuli (un bloc &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;) în care se programeaza o secvență temporizată de tranziții pentru intrări;&lt;br /&gt;
* se folosește un software de simulare pentru a rula testul și a vedea formele de undă.&lt;br /&gt;
&lt;br /&gt;
Astfel, modulul de test pentru sumatorul pe 4 biți va arăta astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AdderTester;&lt;br /&gt;
&lt;br /&gt;
//this is the definition of variables and wires&lt;br /&gt;
//for driving signals  &lt;br /&gt;
logic [3:0] i0;&lt;br /&gt;
logic [3:0] i1;&lt;br /&gt;
logic [4:0] o;&lt;br /&gt;
&lt;br /&gt;
//this is where the stimuls is added for the module&lt;br /&gt;
initial begin&lt;br /&gt;
     i0 = 0;&lt;br /&gt;
     i1 = 0;&lt;br /&gt;
  #5 i0 = 3;&lt;br /&gt;
  #2 i0 = 2;&lt;br /&gt;
     i1 = 1;&lt;br /&gt;
  #3 i0 = 1;&lt;br /&gt;
     i1 = 5;&lt;br /&gt;
  #5 $stop();&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
//this is where the tested module is instantiated  &lt;br /&gt;
Adder deviceUnderTest(&lt;br /&gt;
  .out(o),&lt;br /&gt;
  .in0(i0),&lt;br /&gt;
  .in1(i1)&lt;br /&gt;
);  &lt;br /&gt;
  &lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; este folosit pentru a da valori intrărilor modulului de testat. El iși începe execuția la momentul de timp t = 0. Fiecare linie este executată la același moment de tip, până când este întâlnit operatorul #, care așteaptă trecerea unor unități de timp. Astfel, în exemplul de mai sus, primele două linii se execută la t = 0, linia 3 se execută la t = 5, liniile 4 și 5 la t = 7, liniile 6 și 7 la t = 10 și ultima linie, la t = 15. Apelul funcției $stop() determină sfârșitul simulării.&lt;br /&gt;
&lt;br /&gt;
=== Semnalul de ceas în module de test ===&lt;br /&gt;
&lt;br /&gt;
Cuvântul cheie &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este folosit pentru a executa o atribuire sau apel de funcție în mod repetat, până la sfârșitul simulării. Acesta este în particular folositor pentru a genera un semnal de ceas. Secvența următoare de cod generează un semnal de ceas cu perioada de două unități de timp:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
reg clock;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock = 0;&lt;br /&gt;
    forever #1 clock = !clock;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Regulă:&amp;lt;/font&amp;gt;Pentru circuitele secvențiale, modulul de test va avea două blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. Primul este similar celui de mai sus, și utilizat pentru generarea semnalului de ceas. Al doilea este folosit pentru generarea celorlalte semnale de intrare și directivei de oprire a simulării. Motivul pentru această segregare este faptul că instrucțiunea &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este blocantă (adică instrucțiunile puse după ea nu se execută). Toate blocurile &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; dintr-un modul de test se execută în paralel.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sintaxa SystemVerilog ==&lt;br /&gt;
&lt;br /&gt;
=== Constante ===&lt;br /&gt;
&lt;br /&gt;
Constantele sunt valori numerice. Pentru fiecare valoare, se specifică numărul de biți pe care reprezentată si baza în care este scrisă. Spre exemplu &amp;#039;&amp;#039;&amp;#039;8&amp;#039;b111&amp;#039;&amp;#039;&amp;#039; este o constantă pe 8 biți a cărei valoare în binar este 111 (adică în decimal, 7). În același fel, &amp;#039;&amp;#039;&amp;#039;16&amp;#039;d10&amp;#039;&amp;#039;&amp;#039; reprezintă valoarea 10 în decimal reprezentată pe 16 biți. Este posibilă specificarea valorii fără număr de biți sau bază (în care caz baza implicită este cea decimală, și numărul de biți este aproximat de către compilator).&lt;br /&gt;
&lt;br /&gt;
=== Operatori ===&lt;br /&gt;
&lt;br /&gt;
==== Operatori aritmetici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Adunare || + || a + b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Scădere || - || a - b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Înmulțire || * || a * b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Împărțire || / || a / b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori logici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Egal || == || a == b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Diferit || != || a != b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic || &amp;lt; || a &amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic sau egal || &amp;lt;= || a &amp;lt;= b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare || &amp;gt; || a &amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare sau egal || &amp;gt;= || a &amp;gt;= b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori binari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și || &amp;amp; || a &amp;amp; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv || ^ || a ^ b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Operatori unari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Negare || ~ || ~b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și pe biții unui semnal|| &amp;amp; || &amp;amp;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau pe biții unui semnal|| &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv pe biții unui semnal|| ^ || ^a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori de shiftare pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la stânga  || &amp;lt;&amp;lt; || a &amp;lt;&amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la dreapta  || &amp;gt;&amp;gt; || a &amp;gt;&amp;gt; b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de acces la biți ====&lt;br /&gt;
&lt;br /&gt;
Dându-se un semnal pe n biți, operatorul de access la o sub-secvență din biții semnalului este &amp;#039;&amp;#039;&amp;#039;[m:k]&amp;#039;&amp;#039;&amp;#039; unde m și k sunt indecșii biților doriți, cu n &amp;lt; m &amp;lt; k. Ca exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [31:0] un_registru;&lt;br /&gt;
logic [7:0] un_fir;&lt;br /&gt;
logic alt_fir;&lt;br /&gt;
&lt;br /&gt;
assign un_fir = un_registru[30:23]; //firul &amp;quot;un_fir&amp;quot; ia valoarea data de secventa de biti de la 23 la 30 din registrul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
assign alt_fir = un_fir[3];         //firul &amp;quot;alt_fir&amp;quot; va lua valoarea bitului 3 din semnalul &amp;quot;un_fir&amp;quot; care este bitul 26 din semnalul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de concatenare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de concatenare este &amp;quot;{&amp;quot; și &amp;quot;}&amp;quot;. Astfel, o serie de semnale separate prin virgulă și închise între două acolade va rezulta într-un singur semnal de dimensiune egală cu suma dimensiunilor semnalelor componente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [3:0] a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic c;&lt;br /&gt;
logic [9:0] d;&lt;br /&gt;
&lt;br /&gt;
//semnalul d este format din concatenarea semnalelor a,b,c&lt;br /&gt;
//unde a este pe pozitia cea mai semnificativa si c&lt;br /&gt;
//pe pozitia cea mai putin semnificativa&lt;br /&gt;
assign d = {a,b,c};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de replicare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de replicare este folosit când se dorește replicarea unui semnal de un număr mare sau necunoscut de ori (dat ca parametru). Astfel, construcția &amp;#039;&amp;#039;&amp;#039;{n{m}}&amp;#039;&amp;#039;&amp;#039; reprezintă semnalul &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039;, multiplcat de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; ori.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic [7:0] c;&lt;br /&gt;
logic [15:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = {5{a}}; //b va lua valoarea data de a, replicata de 5 ori&lt;br /&gt;
assign d = {2{c}}; //d va lua valoarea lui c (8 biti) replicata de 2 ori&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Blocuri și operatori condiționali ===&lt;br /&gt;
&lt;br /&gt;
Condițiile se pot exprima în trei moduri:&lt;br /&gt;
* folosing operatorul condițional cunoscut din limbajul C (condiție &amp;#039;&amp;#039;&amp;#039;?&amp;#039;&amp;#039;&amp;#039; valoare_pentru_adevărat &amp;#039;&amp;#039;&amp;#039;:&amp;#039;&amp;#039;&amp;#039; valoare_pentru_fals);&lt;br /&gt;
* folosind construcția &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* folosind constructia &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; respectiv &amp;#039;&amp;#039;&amp;#039;casex - endcase&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;casez - endcase&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Operatorul condițional se poate utiliza în orice tip de bloc. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = a ? c : d; //daca a este adevarat (adica daca este egal cu 1), atunci b ia valoarea lui c, altfel, b ia valoarea lui d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocurile &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; se pot utiliza doar în blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    if(a) begin&lt;br /&gt;
        b = c;&lt;br /&gt;
    end else begin&lt;br /&gt;
        b = d;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemplu &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [1:0] a;&lt;br /&gt;
logic  [3:0] e;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
//daca a este egal cu 0, atunci e ia valoarea lui c&lt;br /&gt;
//daca a este egal cu 1, atunci e ia valoarea lui d&lt;br /&gt;
//in orice alt caz, b ia valoarea 0&lt;br /&gt;
always_comb begin&lt;br /&gt;
    case(a)&lt;br /&gt;
        2&amp;#039;b00: e = c;&lt;br /&gt;
        2&amp;#039;b01: e = d;&lt;br /&gt;
        default: e = 3&amp;#039;b000;&lt;br /&gt;
    endcase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7913</id>
		<title>SystemVerilog</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7913"/>
		<updated>2025-02-20T10:13:02Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Blocuri de instanțiere */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Module (sintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
Limbajul SystemVerilog este structurat pe module. Fiecare modul reprezintă un circuit care implementează o anume funcție. De exemplu, un modul poate reprezenta un sumator, adică un circuit care are două intrări ce specifică cei doi operanzi și o ieșire ce reprezintă rezultatul adunării. Conținutul modulului reprezintă descrierea (structurală sau comportamentală) a porților care calculeaza suma celor două intrări. Prin urmare, definiția unui modul SystemVerilog are două părți:&lt;br /&gt;
* interfață - lista tuturor porturilor de intrare și ieșire ale circuitului, specificate prin nume și dimensiune;&lt;br /&gt;
* implementare - descrierea efectivă a circuitului care se folosește de valorile de intrare pentru a calcula valorile de ieșire;&lt;br /&gt;
&lt;br /&gt;
=== Interfața modulelor SystemVerilog ===&lt;br /&gt;
Interfața modulului &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; este prezentată mai jos. &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ca și în sistemul numeral zecimal, unde suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; cifre are nevoie de &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; cifre (9 + 9 = 18), și în sistemul binar, suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; biți va fi pe &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; biți.&lt;br /&gt;
[[Fișier:Adder_interface.svg|thumb|Reprezentarea interfetei modulului &amp;quot;Adder&amp;quot; (black box)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Cuvintele cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;endmodule&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; sunt folosite pentru a începe și a încheia definirea unui modul. Imediat după cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; urmează numele modulului. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Numele unui modul va începe cu literă mare.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După definirea numelui modulului, urmează lista de porturi, plasată între &amp;#039;&amp;#039;&amp;#039;paranteze rotunde&amp;#039;&amp;#039;&amp;#039; și separate prin &amp;#039;&amp;#039;&amp;#039;virgulă&amp;#039;&amp;#039;&amp;#039;. Cuvintele cheie acceptate sunt &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;output&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de ieșire), &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;input&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de intrare) și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port bidirecțional).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AA00&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Când aveți de ales în privința interfeței unui modul, se evită utilizarea semnalelor de tip &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;. Acestea introduc elemente de tip [http://en.wikipedia.org/wiki/Tri-state_buffer#Tri-state_Buffer Tri-state Buffer] care sunt ineficiente. O alternativă mai eficientă este definirea a două porturi, unul de intrare și unul de ieșire, cu nume similare (ex: &amp;#039;&amp;#039;data_in&amp;#039;&amp;#039; și &amp;#039;&amp;#039;data_out&amp;#039;&amp;#039;).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Întâi se definesc ieșirile, apoi intrările unui modul.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Porturile unui modul se scriu unul sub altul, pe câte o linie, aliniate cu un tab la dreapta față de cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După tipul portului, urmează dimensiunea acestuia, specificată în indecșii biților, unde cel mai puțin semnificativ bit are indexul 0. Spre exemplu, un semnal de 4 biți va avea următoarea specificație &amp;#039;&amp;#039;&amp;#039;[3:0]&amp;#039;&amp;#039;&amp;#039; (bitul cel mai semnificativ are indexul 3, cel mai puțin semnificativ 0, în total 4 biți). &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Semnalelor de un bit le lipsește specificația de dimensiune:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
input semnal_de_un_bit,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După lista de porturi aflată între paranteze, definirea interfeței se termină cu caracterul &amp;#039;&amp;#039;&amp;#039;;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Există module nesintetizabile (care nu au corespondent in porți logice), care sunt folosite ca &amp;quot;programe&amp;quot; de test în medii de simulare și se numesc module de test. Aceste module nu au porturi de intrare și ieșire și sunt utilizate doar pentru a da valori porturilor de intrare ale modulului care se testează, și de a verifica valorile de pe porturile de ieșire ale acestuia. În cazul acestor module, lista de porturi și parantezele rotunde aferente lipsesc:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module TestModule;&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementarea modulelor SystemVerilog ===&lt;br /&gt;
&lt;br /&gt;
Implementarea modulelor SystemVerilog se face prin blocuri. Aceste blocuri pot avea sau nu corespondent într-un ciruit fizic. Dacă toate blocurile unui modul au corespondent într-un circuit fizic, atunci modulul este sintetizabil și poate fi transformat într-un circuit fizic. Blocurile care pot genera construcții sintetizabile sunt de patru tipuri:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri de instanțiere&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;generate&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Blocurile care sunt întotdeauna nesintetizabile și sunt folosite exclusiv pentru simulare:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Nu orice bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; este sintetizabil. Există construcții valide sintactic dar care nu au corespondent unui circuit. Aceste blocuri pot fi simulate, dar nu pot fi utilizate pentru programarea unei plăci [[FPGA]].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ordinea blocurilor într-un modul nu contează.&lt;br /&gt;
&lt;br /&gt;
==== Cuvântul cheie &amp;quot;logic&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
In SystemVerilog, toate semnalele sunt de tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, indiferent de natura lor. În urma sintezei, semnalele vor deveni fire, latch-uri sau registre.&lt;br /&gt;
&lt;br /&gt;
Semnalele într-un modul SystemVerilog se definesc în felul următor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
logic [3:0] semnal;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Niciun element nu își poate schimba valoarea în mai mult de un bloc.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Adder.png|thumb|Modulul Adder implementat]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assign&amp;#039;&amp;#039;&amp;#039; este un cuvănt cheie care generează [[circuite combinaționale]]. Cum sumatorul este un [[circuite combinaționale|circuit combinațional]], îl putem implementa cu un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign out = in0 + in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; În general, un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; va genera un circuit sintetizabil. Există și excepții, atunci când operația dorită este prea complexă pentru a fi implementată printr-un circuit combinațional, în mod eficient. Spre exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
assign out = in0 / in1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nu este un cod sintetizabil pentru majoritatea tool-urilor de sinteză, dar funcționează perfect într-o simulare.&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinaționale ====&lt;br /&gt;
&lt;br /&gt;
Formatul pentru un bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinational este următorul:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    //...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un bloc de tip &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; este sensibil la modificare oricarui semnal din cadrul modulului unde a fost definit, iesirile comandate de acest bloc sunt recalculate la orice modificare a unui semnal de intrare.&lt;br /&gt;
&lt;br /&gt;
În acest caz, putem reface implementarea sumatorului folosind un bloc &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    out = in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; secvențiale. Asignări non-blocante (non-blocking assignments) ====&lt;br /&gt;
&lt;br /&gt;
[[Circuite secvențiale|Circuitele secvențiale]] sunt circuitele care sunt sincronizate de [[Circuite secvențiale#Semnalul de ceas|semnalul de ceas]]. Acest semnal este, de obicei, produs de un generator de ceas și se definește ca intrare pentru fiecare modul secvențial (în care există cel puțin un registru). Putem modifica exemplul anterior, astfel încât ieșirea modulului de sumare să fie sincronă (adică să se modifice doar pe frontul pozitiv de ceas). Astfel, în interfața modulului, apare și semnalul de ceas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementation here&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Pentru descrierea circuitelor secvențiale, se folosește întotdeauna un bloc &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:SyncedAdder.png|thumb|Modulul SyncedAdder]]&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; descrie un circuit secvențial și are în lista de sensitivități, de obicei, doar semnalul de ceas. Acesta este sensibil la o tranziție a semnalului de ceas (numită front), de obicei cea din 0 în 1 (numită frontul pozitiv, sau frontul crescător al ceasului). Astfel, putem implementa sumatorul sincron în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    out &amp;lt;= in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Cuvântul cheie care specifică frontul pozitiv al unui semnal este &amp;#039;&amp;#039;&amp;#039;posedge&amp;#039;&amp;#039;&amp;#039;, iar cel pentru frontul negativ al semnalului este &amp;#039;&amp;#039;&amp;#039;negedge&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Observați operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; folosit pentru atribuirea sumei registrului destinație. Acesta NU este operatorul logic de &amp;#039;&amp;#039;mai mic sau egal&amp;#039;&amp;#039;, ci reprezintă un mod de atribuire care se numește non-blocantă. Diferența dintre atribuirea blocantă (&amp;#039;&amp;#039;&amp;#039;=&amp;#039;&amp;#039;&amp;#039;) și cea non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) este că cea de-a doua întâi evalueaza toate expresiile din partea dreaptă a operatorului de atribuire (în cazul de față, suma &amp;#039;&amp;#039;in0 + in1&amp;#039;&amp;#039;) și abia apoi asignează rezultatul registrului destinație. Spre exemplu, dacă dorim să inversăm valorile a două registre, &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; și &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;, astfel încât &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; să ia valoarea lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039; și invers, vom face în felul următor: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod corect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 &amp;lt;= reg1;&lt;br /&gt;
    reg1 &amp;lt;= reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modulul se va comporta conform așteptărilor. Operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; nu va bloca restul evaluărilor din blocul always și prin urmare toate asignările se fac simultan, după evaluarea expresiilor din partea dreaptă a operatorului. Pe de altă parte, dacă facem asignarea blocantă:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod incorect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 = reg1;&lt;br /&gt;
    reg1 = reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
aceasta va bloca restul operațiilor până când asignarea se termină. În acest caz, după primul front de ceas, ambele registre vor conține valoarea inițială a lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Operatorul de asignare non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) se folosește doar în blocuri &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; În același bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;, se folosește același tip de operator de asignare pentru toate operațiile. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Utilizați asignare non-blocantă pentru toate blocurile &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; care generează circuite secvențiale (sunt sincronizate de ceas) și asignare blocantă în toate celelalte cazuri. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri de instanțiere ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:adder4.png|thumb|Un sumator de patru numere format din trei sumatoare de două numere]]&lt;br /&gt;
&lt;br /&gt;
Odată definit un modul, acesta poate fi folosit de oricâte ori pe parcursul unuia sau mai multor proiecte. Acest sistem se numește instanțiere. Să luam, ca exemplu, un modul care trebuie să facă suma a 4 numere pe 3 biți. Putem să folosim în acest scop modulul &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; pe 4 biți definit mai sus, în configurația din figură. Observați că se utilizează același modul de trei ori. Este ineficient și inutil să scriem de trei ori implementarea modulului, așa că vom recurge la metoda instanțierii. Orice instanță a unui modul trebuie să aibă un nume unic, după cum și într-un limbaj de programare, variabilele de același fel trebuie sa aibă un nume unic.&lt;br /&gt;
&lt;br /&gt;
Se observă în continuare că există semnale (fire) în modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039;, care nu sunt nici intrări, nici ieșiri, și sunt folosite doar pentru conectarea modulelor &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; (cel roșu și cel verde). &lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru instanțierea unui modul este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
NumeModulInstantiat numeInstanta(&lt;br /&gt;
    .nume_intrare_sau_iesire_0(nume_semnal_legat_la_intrare_sau_iesire_0),&lt;br /&gt;
    .nume_intrare_sau_iesire_1(nume_semnal_legat_la_intrare_sau_iesire_1),&lt;br /&gt;
    //...&lt;br /&gt;
    .nume_intrare_sau_iesire_n(nume_semnal_legat_la_intrare_sau_iesire_n),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Codul SystemVerilog pentru modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039; este:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [3:0] subsum0;&lt;br /&gt;
logic [3:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0(in0),        //la intrarea numita in0 a instantei adder0 se leaga intrarea in0 a modulului&lt;br /&gt;
    .in1(in1)         //la intrarea numita in1 a instantei adder0 se leaga intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0(in2),        //la intrarea numita in0 a instantei adder1 se leaga intrarea in2 a modulului&lt;br /&gt;
    .in1(in3)         //la intrarea numita in1 a instantei adder1 se leaga intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),        //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0),    //la intrarea numita in0 a instantei adder2 se leaga firul subsum0&lt;br /&gt;
    .in1(subsum1)     //la intrarea numita in1 a instantei adder2 se leaga firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Instanțele adder0 și adder1 au legate la intrări semnale de 3 biți și la ieșire legate fire de 4 biți, cu toate că porturile lor au 4, respectiv 5 biți (intrările și ieșirile). În acest caz, semnalele se leagă fiind aliniate la cel mai puțin semnificativ bit și se generează un mesaj de avertizare (port mismatch). Cu toate că programele folosite de noi acceptă codul de mai sus, există programe care nu acceptă astfel de construcții, și se opresc cu eroari. Ca să fim foarte riguroși, vom folosi operatorul de concatenare pentru a corecta codul în felul următor (mai multe despre operatori veți putea afla mai jos):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3,&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [4:0] subsum0; //definim firele pe 5 biți deoarece iesirea instantelor adder0 si adder1 este pe 5 biti&lt;br /&gt;
logic [4:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0({1&amp;#039;b0,in0}), //la intrarea numita in0 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in0 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in1})  //la intrarea numita in1 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0({1&amp;#039;b0,in2}), //la intrarea numita in0 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in2 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in3})  //la intrarea numita in1 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),           //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0[3:0]),  //la intrarea numita in0 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum0&lt;br /&gt;
    .in1(subsum1[3:0])   //la intrarea numita in1 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module de test (nesintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
[[Fișier:addertester.png|thumb|Modul de test pentru sumatorul pe 4 biți]]&lt;br /&gt;
&lt;br /&gt;
Modulele de test sunt folosite pentru verificarea funcționalității unui alt modul sintetizabil. Figura alăturată prezintă schema bloc pentru un modul de test pentru sumatorul pe 4 biți. Un modul de test generic urmărește câteva reguli clare:&lt;br /&gt;
&lt;br /&gt;
* pentru fiecare intrare a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu intrarea, folosite pentru a genera stimuli pentru circuit;&lt;br /&gt;
* pentru fiecare ieșire a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu ieșirea, folosite pentru verificarea comportamentului (de obicei prin afișarea de forme de undă);&lt;br /&gt;
* se instanțiază modulul de testat și se leagă variabilele definite anterior la intrările și ieșirile instanței;&lt;br /&gt;
* se scrie un generator de stimuli (un bloc &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;) în care se programeaza o secvență temporizată de tranziții pentru intrări;&lt;br /&gt;
* se folosește un software de simulare pentru a rula testul și a vedea formele de undă.&lt;br /&gt;
&lt;br /&gt;
Astfel, modulul de test pentru sumatorul pe 4 biți va arăta astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AdderTester;&lt;br /&gt;
&lt;br /&gt;
//this is the definition of variables and wires&lt;br /&gt;
//for driving signals  &lt;br /&gt;
logic [3:0] i0;&lt;br /&gt;
logic [3:0] i1;&lt;br /&gt;
logic [4:0] o;&lt;br /&gt;
&lt;br /&gt;
//this is where the stimuls is added for the module&lt;br /&gt;
initial begin&lt;br /&gt;
     i0 = 0;&lt;br /&gt;
     i1 = 0;&lt;br /&gt;
  #5 i0 = 3;&lt;br /&gt;
  #2 i0 = 2;&lt;br /&gt;
     i1 = 1;&lt;br /&gt;
  #3 i0 = 1;&lt;br /&gt;
     i1 = 5;&lt;br /&gt;
  #5 $stop();&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
//this is where the tested module is instantiated  &lt;br /&gt;
Adder deviceUnderTest(&lt;br /&gt;
  .out(o),&lt;br /&gt;
  .in0(i0),&lt;br /&gt;
  .in1(i1)&lt;br /&gt;
);  &lt;br /&gt;
  &lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; este folosit pentru a da valori intrărilor modulului de testat. El iși începe execuția la momentul de timp t = 0. Fiecare linie este executată la același moment de tip, până când este întâlnit operatorul #, care așteaptă trecerea unor unități de timp. Astfel, în exemplul de mai sus, primele două linii se execută la t = 0, linia 3 se execută la t = 5, liniile 4 și 5 la t = 7, liniile 6 și 7 la t = 10 și ultima linie, la t = 15. Apelul funcției $stop() determină sfârșitul simulării.&lt;br /&gt;
&lt;br /&gt;
=== Semnalul de ceas în module de test ===&lt;br /&gt;
&lt;br /&gt;
Cuvântul cheie &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este folosit pentru a executa o atribuire sau apel de funcție în mod repetat, până la sfârșitul simulării. Acesta este în particular folositor pentru a genera un semnal de ceas. Secvența următoare de cod generează un semnal de ceas cu perioada de două unități de timp:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
reg clock;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock = 0;&lt;br /&gt;
    forever #1 clock = !clock;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Regulă:&amp;lt;/font&amp;gt;Pentru circuitele secvențiale, modulul de test va avea două blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. Primul este similar celui de mai sus, și utilizat pentru generarea semnalului de ceas. Al doilea este folosit pentru generarea celorlalte semnale de intrare și directivei de oprire a simulării. Motivul pentru această segregare este faptul că instrucțiunea &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este blocantă (adică instrucțiunile puse după ea nu se execută). Toate blocurile &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; dintr-un modul de test se execută în paralel.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sintaxa SystemVerilog ==&lt;br /&gt;
&lt;br /&gt;
=== Constante ===&lt;br /&gt;
&lt;br /&gt;
Constantele sunt valori numerice. Pentru fiecare valoare, se specifică numărul de biți pe care reprezentată si baza în care este scrisă. Spre exemplu &amp;#039;&amp;#039;&amp;#039;8&amp;#039;b111&amp;#039;&amp;#039;&amp;#039; este o constantă pe 8 biți a cărei valoare în binar este 111 (adică în decimal, 7). În același fel, &amp;#039;&amp;#039;&amp;#039;16&amp;#039;d10&amp;#039;&amp;#039;&amp;#039; reprezintă valoarea 10 în decimal reprezentată pe 16 biți. Este posibilă specificarea valorii fără număr de biți sau bază (în care caz baza implicită este cea decimală, și numărul de biți este aproximat de către compilator).&lt;br /&gt;
&lt;br /&gt;
=== Operatori ===&lt;br /&gt;
&lt;br /&gt;
==== Operatori aritmetici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Adunare || + || a + b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Scădere || - || a - b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Înmulțire || * || a * b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Împărțire || / || a / b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori logici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Egal || == || a == b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Diferit || != || a != b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic || &amp;lt; || a &amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic sau egal || &amp;lt;= || a &amp;lt;= b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare || &amp;gt; || a &amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare sau egal || &amp;gt;= || a &amp;gt;= b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori binari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și || &amp;amp; || a &amp;amp; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv || ^ || a ^ b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Operatori unari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Negare || ~ || ~b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și pe biții unui semnal|| &amp;amp; || &amp;amp;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau pe biții unui semnal|| &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv pe biții unui semnal|| ^ || ^a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori de shiftare pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la stânga  || &amp;lt;&amp;lt; || a &amp;lt;&amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la dreapta  || &amp;gt;&amp;gt; || a &amp;gt;&amp;gt; b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de acces la biți ====&lt;br /&gt;
&lt;br /&gt;
Dându-se un semnal pe n biți, operatorul de access la o sub-secvență din biții semnalului este &amp;#039;&amp;#039;&amp;#039;[m:k]&amp;#039;&amp;#039;&amp;#039; unde m și k sunt indecșii biților doriți, cu n &amp;lt; m &amp;lt; k. Ca exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [31:0] un_registru;&lt;br /&gt;
logic [7:0] un_fir;&lt;br /&gt;
logic alt_fir;&lt;br /&gt;
&lt;br /&gt;
assign un_fir = un_registru[30:23]; //firul &amp;quot;un_fir&amp;quot; ia valoarea data de secventa de biti de la 23 la 30 din registrul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
assign alt_fir = un_fir[3];         //firul &amp;quot;alt_fir&amp;quot; va lua valoarea bitului 3 din semnalul &amp;quot;un_fir&amp;quot; care este bitul 26 din semnalul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de concatenare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de concatenare este &amp;quot;{&amp;quot; și &amp;quot;}&amp;quot;. Astfel, o serie de semnale separate prin virgulă și închise între două acolade va rezulta într-un singur semnal de dimensiune egală cu suma dimensiunilor semnalelor componente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [3:0] a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic c;&lt;br /&gt;
logic [9:0] d;&lt;br /&gt;
&lt;br /&gt;
//semnalul d este format din concatenarea semnalelor a,b,c&lt;br /&gt;
//unde a este pe pozitia cea mai semnificativa si c&lt;br /&gt;
//pe pozitia cea mai putin semnificativa&lt;br /&gt;
assign d = {a,b,c};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de replicare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de replicare este folosit când se dorește replicarea unui semnal de un număr mare sau necunoscut de ori (dat ca parametru). Astfel, construcția &amp;#039;&amp;#039;&amp;#039;{n{m}}&amp;#039;&amp;#039;&amp;#039; reprezintă semnalul &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039;, multiplcat de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; ori.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic [7:0] c;&lt;br /&gt;
logic [15:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = {5{a}}; //b va lua valoarea data de a, replicata de 5 ori&lt;br /&gt;
assign d = {2{c}}; //d va lua valoarea lui c (8 biti) replicata de 2 ori&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Blocuri și operatori condiționali ===&lt;br /&gt;
&lt;br /&gt;
Condițiile se pot exprima în trei moduri:&lt;br /&gt;
* folosing operatorul condițional cunoscut din limbajul C (condiție &amp;#039;&amp;#039;&amp;#039;?&amp;#039;&amp;#039;&amp;#039; valoare_pentru_adevărat &amp;#039;&amp;#039;&amp;#039;:&amp;#039;&amp;#039;&amp;#039; valoare_pentru_fals);&lt;br /&gt;
* folosind construcția &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* folosind constructia &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; respectiv &amp;#039;&amp;#039;&amp;#039;casex - endcase&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;casez - endcase&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Operatorul condițional se poate utiliza în orice tip de bloc. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = a ? c : d; //daca a este adevarat (adica daca este egal cu 1), atunci b ia valoarea lui c, altfel, b ia valoarea lui d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocurile &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; se pot utiliza doar în blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    if(a) begin&lt;br /&gt;
        b = c;&lt;br /&gt;
    end else begin&lt;br /&gt;
        b = d;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemplu &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [1:0] a;&lt;br /&gt;
logic  [3:0] e;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
//daca a este egal cu 0, atunci e ia valoarea lui c&lt;br /&gt;
//daca a este egal cu 1, atunci e ia valoarea lui d&lt;br /&gt;
//in orice alt caz, b ia valoarea 0&lt;br /&gt;
always_comb begin&lt;br /&gt;
    case(a)&lt;br /&gt;
        2&amp;#039;b00: e = c;&lt;br /&gt;
        2&amp;#039;b01: e = d;&lt;br /&gt;
        default: e = 3&amp;#039;b000;&lt;br /&gt;
    endcase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7912</id>
		<title>SystemVerilog</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7912"/>
		<updated>2025-02-20T10:10:52Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Blocuri always secvențiale. Asignări non-blocante (non-blocking assignments) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Module (sintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
Limbajul SystemVerilog este structurat pe module. Fiecare modul reprezintă un circuit care implementează o anume funcție. De exemplu, un modul poate reprezenta un sumator, adică un circuit care are două intrări ce specifică cei doi operanzi și o ieșire ce reprezintă rezultatul adunării. Conținutul modulului reprezintă descrierea (structurală sau comportamentală) a porților care calculeaza suma celor două intrări. Prin urmare, definiția unui modul SystemVerilog are două părți:&lt;br /&gt;
* interfață - lista tuturor porturilor de intrare și ieșire ale circuitului, specificate prin nume și dimensiune;&lt;br /&gt;
* implementare - descrierea efectivă a circuitului care se folosește de valorile de intrare pentru a calcula valorile de ieșire;&lt;br /&gt;
&lt;br /&gt;
=== Interfața modulelor SystemVerilog ===&lt;br /&gt;
Interfața modulului &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; este prezentată mai jos. &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ca și în sistemul numeral zecimal, unde suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; cifre are nevoie de &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; cifre (9 + 9 = 18), și în sistemul binar, suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; biți va fi pe &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; biți.&lt;br /&gt;
[[Fișier:Adder_interface.svg|thumb|Reprezentarea interfetei modulului &amp;quot;Adder&amp;quot; (black box)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Cuvintele cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;endmodule&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; sunt folosite pentru a începe și a încheia definirea unui modul. Imediat după cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; urmează numele modulului. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Numele unui modul va începe cu literă mare.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După definirea numelui modulului, urmează lista de porturi, plasată între &amp;#039;&amp;#039;&amp;#039;paranteze rotunde&amp;#039;&amp;#039;&amp;#039; și separate prin &amp;#039;&amp;#039;&amp;#039;virgulă&amp;#039;&amp;#039;&amp;#039;. Cuvintele cheie acceptate sunt &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;output&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de ieșire), &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;input&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de intrare) și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port bidirecțional).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AA00&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Când aveți de ales în privința interfeței unui modul, se evită utilizarea semnalelor de tip &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;. Acestea introduc elemente de tip [http://en.wikipedia.org/wiki/Tri-state_buffer#Tri-state_Buffer Tri-state Buffer] care sunt ineficiente. O alternativă mai eficientă este definirea a două porturi, unul de intrare și unul de ieșire, cu nume similare (ex: &amp;#039;&amp;#039;data_in&amp;#039;&amp;#039; și &amp;#039;&amp;#039;data_out&amp;#039;&amp;#039;).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Întâi se definesc ieșirile, apoi intrările unui modul.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Porturile unui modul se scriu unul sub altul, pe câte o linie, aliniate cu un tab la dreapta față de cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După tipul portului, urmează dimensiunea acestuia, specificată în indecșii biților, unde cel mai puțin semnificativ bit are indexul 0. Spre exemplu, un semnal de 4 biți va avea următoarea specificație &amp;#039;&amp;#039;&amp;#039;[3:0]&amp;#039;&amp;#039;&amp;#039; (bitul cel mai semnificativ are indexul 3, cel mai puțin semnificativ 0, în total 4 biți). &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Semnalelor de un bit le lipsește specificația de dimensiune:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
input semnal_de_un_bit,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După lista de porturi aflată între paranteze, definirea interfeței se termină cu caracterul &amp;#039;&amp;#039;&amp;#039;;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Există module nesintetizabile (care nu au corespondent in porți logice), care sunt folosite ca &amp;quot;programe&amp;quot; de test în medii de simulare și se numesc module de test. Aceste module nu au porturi de intrare și ieșire și sunt utilizate doar pentru a da valori porturilor de intrare ale modulului care se testează, și de a verifica valorile de pe porturile de ieșire ale acestuia. În cazul acestor module, lista de porturi și parantezele rotunde aferente lipsesc:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module TestModule;&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementarea modulelor SystemVerilog ===&lt;br /&gt;
&lt;br /&gt;
Implementarea modulelor SystemVerilog se face prin blocuri. Aceste blocuri pot avea sau nu corespondent într-un ciruit fizic. Dacă toate blocurile unui modul au corespondent într-un circuit fizic, atunci modulul este sintetizabil și poate fi transformat într-un circuit fizic. Blocurile care pot genera construcții sintetizabile sunt de patru tipuri:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri de instanțiere&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;generate&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Blocurile care sunt întotdeauna nesintetizabile și sunt folosite exclusiv pentru simulare:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Nu orice bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; este sintetizabil. Există construcții valide sintactic dar care nu au corespondent unui circuit. Aceste blocuri pot fi simulate, dar nu pot fi utilizate pentru programarea unei plăci [[FPGA]].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ordinea blocurilor într-un modul nu contează.&lt;br /&gt;
&lt;br /&gt;
==== Cuvântul cheie &amp;quot;logic&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
In SystemVerilog, toate semnalele sunt de tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, indiferent de natura lor. În urma sintezei, semnalele vor deveni fire, latch-uri sau registre.&lt;br /&gt;
&lt;br /&gt;
Semnalele într-un modul SystemVerilog se definesc în felul următor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
logic [3:0] semnal;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Niciun element nu își poate schimba valoarea în mai mult de un bloc.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Adder.png|thumb|Modulul Adder implementat]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assign&amp;#039;&amp;#039;&amp;#039; este un cuvănt cheie care generează [[circuite combinaționale]]. Cum sumatorul este un [[circuite combinaționale|circuit combinațional]], îl putem implementa cu un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign out = in0 + in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; În general, un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; va genera un circuit sintetizabil. Există și excepții, atunci când operația dorită este prea complexă pentru a fi implementată printr-un circuit combinațional, în mod eficient. Spre exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
assign out = in0 / in1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nu este un cod sintetizabil pentru majoritatea tool-urilor de sinteză, dar funcționează perfect într-o simulare.&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinaționale ====&lt;br /&gt;
&lt;br /&gt;
Formatul pentru un bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinational este următorul:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    //...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un bloc de tip &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; este sensibil la modificare oricarui semnal din cadrul modulului unde a fost definit, iesirile comandate de acest bloc sunt recalculate la orice modificare a unui semnal de intrare.&lt;br /&gt;
&lt;br /&gt;
În acest caz, putem reface implementarea sumatorului folosind un bloc &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    out = in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; secvențiale. Asignări non-blocante (non-blocking assignments) ====&lt;br /&gt;
&lt;br /&gt;
[[Circuite secvențiale|Circuitele secvențiale]] sunt circuitele care sunt sincronizate de [[Circuite secvențiale#Semnalul de ceas|semnalul de ceas]]. Acest semnal este, de obicei, produs de un generator de ceas și se definește ca intrare pentru fiecare modul secvențial (în care există cel puțin un registru). Putem modifica exemplul anterior, astfel încât ieșirea modulului de sumare să fie sincronă (adică să se modifice doar pe frontul pozitiv de ceas). Astfel, în interfața modulului, apare și semnalul de ceas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementation here&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Pentru descrierea circuitelor secvențiale, se folosește întotdeauna un bloc &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:SyncedAdder.png|thumb|Modulul SyncedAdder]]&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; descrie un circuit secvențial și are în lista de sensitivități, de obicei, doar semnalul de ceas. Acesta este sensibil la o tranziție a semnalului de ceas (numită front), de obicei cea din 0 în 1 (numită frontul pozitiv, sau frontul crescător al ceasului). Astfel, putem implementa sumatorul sincron în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    out &amp;lt;= in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Cuvântul cheie care specifică frontul pozitiv al unui semnal este &amp;#039;&amp;#039;&amp;#039;posedge&amp;#039;&amp;#039;&amp;#039;, iar cel pentru frontul negativ al semnalului este &amp;#039;&amp;#039;&amp;#039;negedge&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Observați operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; folosit pentru atribuirea sumei registrului destinație. Acesta NU este operatorul logic de &amp;#039;&amp;#039;mai mic sau egal&amp;#039;&amp;#039;, ci reprezintă un mod de atribuire care se numește non-blocantă. Diferența dintre atribuirea blocantă (&amp;#039;&amp;#039;&amp;#039;=&amp;#039;&amp;#039;&amp;#039;) și cea non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) este că cea de-a doua întâi evalueaza toate expresiile din partea dreaptă a operatorului de atribuire (în cazul de față, suma &amp;#039;&amp;#039;in0 + in1&amp;#039;&amp;#039;) și abia apoi asignează rezultatul registrului destinație. Spre exemplu, dacă dorim să inversăm valorile a două registre, &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; și &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;, astfel încât &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; să ia valoarea lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039; și invers, vom face în felul următor: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod corect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 &amp;lt;= reg1;&lt;br /&gt;
    reg1 &amp;lt;= reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modulul se va comporta conform așteptărilor. Operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; nu va bloca restul evaluărilor din blocul always și prin urmare toate asignările se fac simultan, după evaluarea expresiilor din partea dreaptă a operatorului. Pe de altă parte, dacă facem asignarea blocantă:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod incorect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 = reg1;&lt;br /&gt;
    reg1 = reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
aceasta va bloca restul operațiilor până când asignarea se termină. În acest caz, după primul front de ceas, ambele registre vor conține valoarea inițială a lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Operatorul de asignare non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) se folosește doar în blocuri &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; În același bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;, se folosește același tip de operator de asignare pentru toate operațiile. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Utilizați asignare non-blocantă pentru toate blocurile &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; care generează circuite secvențiale (sunt sincronizate de ceas) și asignare blocantă în toate celelalte cazuri. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri de instanțiere ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:adder4.png|thumb|Un sumator de patru numere format din trei sumatoare de două numere]]&lt;br /&gt;
&lt;br /&gt;
Odată definit un modul, acesta poate fi folosit de oricâte ori pe parcursul unuia sau mai multor proiecte. Acest sistem se numește instanțiere. Să luam, ca exemplu, un modul care trebuie să facă suma a 4 numere pe 3 biți. Putem să folosim în acest scop modulul &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; pe 4 biți definit mai sus, în configurația din figură. Observați că se utilizează același modul de trei ori. Este ineficient și inutil să scriem de trei ori implementarea modulului, așa că vom recurge la metoda instanțierii. Orice instanță a unui modul trebuie să aibă un nume unic, după cum și într-un limbaj de programare, variabilele de același fel trebuie sa aibă un nume unic.&lt;br /&gt;
&lt;br /&gt;
Se observă în continuare că există semnale (fire) în modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039;, care nu sunt nici intrări, nici ieșiri, și sunt folosite doar pentru conectarea modulelor &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; (cel roșu și cel verde). Aceste semnale sunt fire (&amp;#039;&amp;#039;&amp;#039;wire&amp;#039;&amp;#039;&amp;#039;) și trebuie declarate ca atare.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru instanțierea unui modul este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
NumeModulInstantiat numeInstanta(&lt;br /&gt;
    .nume_intrare_sau_iesire_0(nume_semnal_legat_la_intrare_sau_iesire_0),&lt;br /&gt;
    .nume_intrare_sau_iesire_1(nume_semnal_legat_la_intrare_sau_iesire_1),&lt;br /&gt;
    //...&lt;br /&gt;
    .nume_intrare_sau_iesire_n(nume_semnal_legat_la_intrare_sau_iesire_n),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Haideți deci să vedem cum arată codul SystemVerilog pentru modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [3:0] subsum0;&lt;br /&gt;
logic [3:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0(in0),        //la intrarea numita in0 a instantei adder0 se leaga intrarea in0 a modulului&lt;br /&gt;
    .in1(in1)         //la intrarea numita in1 a instantei adder0 se leaga intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0(in2),        //la intrarea numita in0 a instantei adder1 se leaga intrarea in2 a modulului&lt;br /&gt;
    .in1(in3)         //la intrarea numita in1 a instantei adder1 se leaga intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),        //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0),    //la intrarea numita in0 a instantei adder2 se leaga firul subsum0&lt;br /&gt;
    .in1(subsum1)     //la intrarea numita in1 a instantei adder2 se leaga firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Instanțele adder0 și adder1 au legate la intrări semnale de 3 biți și la ieșire legate fire de 4 biți, cu toate că porturile lor au 4, respectiv 5 biți (intrările și ieșirile). În acest caz, semnalele se leagă fiind aliniate la cel mai puțin semnificativ bit și se generează un mesaj de avertizare (port mismatch). Cu toate că programele folosite de noi acceptă codul de mai sus, există programe care nu acceptă astfel de construcții, și se opresc cu eroari. Ca să fim foarte riguroși, vom folosi operatorul de concatenare pentru a corecta codul în felul următor (mai multe despre operatori veți putea afla mai jos):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3,&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [4:0] subsum0; //definim firele pe 5 biți deoarece iesirea instantelor adder0 si adder1 este pe 5 biti&lt;br /&gt;
logic [4:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0({1&amp;#039;b0,in0}), //la intrarea numita in0 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in0 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in1})  //la intrarea numita in1 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0({1&amp;#039;b0,in2}), //la intrarea numita in0 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in2 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in3})  //la intrarea numita in1 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),           //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0[3:0]),  //la intrarea numita in0 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum0&lt;br /&gt;
    .in1(subsum1[3:0])   //la intrarea numita in1 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module de test (nesintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
[[Fișier:addertester.png|thumb|Modul de test pentru sumatorul pe 4 biți]]&lt;br /&gt;
&lt;br /&gt;
Modulele de test sunt folosite pentru verificarea funcționalității unui alt modul sintetizabil. Figura alăturată prezintă schema bloc pentru un modul de test pentru sumatorul pe 4 biți. Un modul de test generic urmărește câteva reguli clare:&lt;br /&gt;
&lt;br /&gt;
* pentru fiecare intrare a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu intrarea, folosite pentru a genera stimuli pentru circuit;&lt;br /&gt;
* pentru fiecare ieșire a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu ieșirea, folosite pentru verificarea comportamentului (de obicei prin afișarea de forme de undă);&lt;br /&gt;
* se instanțiază modulul de testat și se leagă variabilele definite anterior la intrările și ieșirile instanței;&lt;br /&gt;
* se scrie un generator de stimuli (un bloc &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;) în care se programeaza o secvență temporizată de tranziții pentru intrări;&lt;br /&gt;
* se folosește un software de simulare pentru a rula testul și a vedea formele de undă.&lt;br /&gt;
&lt;br /&gt;
Astfel, modulul de test pentru sumatorul pe 4 biți va arăta astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AdderTester;&lt;br /&gt;
&lt;br /&gt;
//this is the definition of variables and wires&lt;br /&gt;
//for driving signals  &lt;br /&gt;
logic [3:0] i0;&lt;br /&gt;
logic [3:0] i1;&lt;br /&gt;
logic [4:0] o;&lt;br /&gt;
&lt;br /&gt;
//this is where the stimuls is added for the module&lt;br /&gt;
initial begin&lt;br /&gt;
     i0 = 0;&lt;br /&gt;
     i1 = 0;&lt;br /&gt;
  #5 i0 = 3;&lt;br /&gt;
  #2 i0 = 2;&lt;br /&gt;
     i1 = 1;&lt;br /&gt;
  #3 i0 = 1;&lt;br /&gt;
     i1 = 5;&lt;br /&gt;
  #5 $stop();&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
//this is where the tested module is instantiated  &lt;br /&gt;
Adder deviceUnderTest(&lt;br /&gt;
  .out(o),&lt;br /&gt;
  .in0(i0),&lt;br /&gt;
  .in1(i1)&lt;br /&gt;
);  &lt;br /&gt;
  &lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; este folosit pentru a da valori intrărilor modulului de testat. El iși începe execuția la momentul de timp t = 0. Fiecare linie este executată la același moment de tip, până când este întâlnit operatorul #, care așteaptă trecerea unor unități de timp. Astfel, în exemplul de mai sus, primele două linii se execută la t = 0, linia 3 se execută la t = 5, liniile 4 și 5 la t = 7, liniile 6 și 7 la t = 10 și ultima linie, la t = 15. Apelul funcției $stop() determină sfârșitul simulării.&lt;br /&gt;
&lt;br /&gt;
=== Semnalul de ceas în module de test ===&lt;br /&gt;
&lt;br /&gt;
Cuvântul cheie &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este folosit pentru a executa o atribuire sau apel de funcție în mod repetat, până la sfârșitul simulării. Acesta este în particular folositor pentru a genera un semnal de ceas. Secvența următoare de cod generează un semnal de ceas cu perioada de două unități de timp:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
reg clock;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock = 0;&lt;br /&gt;
    forever #1 clock = !clock;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Regulă:&amp;lt;/font&amp;gt;Pentru circuitele secvențiale, modulul de test va avea două blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. Primul este similar celui de mai sus, și utilizat pentru generarea semnalului de ceas. Al doilea este folosit pentru generarea celorlalte semnale de intrare și directivei de oprire a simulării. Motivul pentru această segregare este faptul că instrucțiunea &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este blocantă (adică instrucțiunile puse după ea nu se execută). Toate blocurile &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; dintr-un modul de test se execută în paralel.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sintaxa SystemVerilog ==&lt;br /&gt;
&lt;br /&gt;
=== Constante ===&lt;br /&gt;
&lt;br /&gt;
Constantele sunt valori numerice. Pentru fiecare valoare, se specifică numărul de biți pe care reprezentată si baza în care este scrisă. Spre exemplu &amp;#039;&amp;#039;&amp;#039;8&amp;#039;b111&amp;#039;&amp;#039;&amp;#039; este o constantă pe 8 biți a cărei valoare în binar este 111 (adică în decimal, 7). În același fel, &amp;#039;&amp;#039;&amp;#039;16&amp;#039;d10&amp;#039;&amp;#039;&amp;#039; reprezintă valoarea 10 în decimal reprezentată pe 16 biți. Este posibilă specificarea valorii fără număr de biți sau bază (în care caz baza implicită este cea decimală, și numărul de biți este aproximat de către compilator).&lt;br /&gt;
&lt;br /&gt;
=== Operatori ===&lt;br /&gt;
&lt;br /&gt;
==== Operatori aritmetici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Adunare || + || a + b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Scădere || - || a - b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Înmulțire || * || a * b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Împărțire || / || a / b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori logici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Egal || == || a == b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Diferit || != || a != b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic || &amp;lt; || a &amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic sau egal || &amp;lt;= || a &amp;lt;= b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare || &amp;gt; || a &amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare sau egal || &amp;gt;= || a &amp;gt;= b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori binari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și || &amp;amp; || a &amp;amp; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv || ^ || a ^ b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Operatori unari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Negare || ~ || ~b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și pe biții unui semnal|| &amp;amp; || &amp;amp;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau pe biții unui semnal|| &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv pe biții unui semnal|| ^ || ^a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori de shiftare pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la stânga  || &amp;lt;&amp;lt; || a &amp;lt;&amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la dreapta  || &amp;gt;&amp;gt; || a &amp;gt;&amp;gt; b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de acces la biți ====&lt;br /&gt;
&lt;br /&gt;
Dându-se un semnal pe n biți, operatorul de access la o sub-secvență din biții semnalului este &amp;#039;&amp;#039;&amp;#039;[m:k]&amp;#039;&amp;#039;&amp;#039; unde m și k sunt indecșii biților doriți, cu n &amp;lt; m &amp;lt; k. Ca exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [31:0] un_registru;&lt;br /&gt;
logic [7:0] un_fir;&lt;br /&gt;
logic alt_fir;&lt;br /&gt;
&lt;br /&gt;
assign un_fir = un_registru[30:23]; //firul &amp;quot;un_fir&amp;quot; ia valoarea data de secventa de biti de la 23 la 30 din registrul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
assign alt_fir = un_fir[3];         //firul &amp;quot;alt_fir&amp;quot; va lua valoarea bitului 3 din semnalul &amp;quot;un_fir&amp;quot; care este bitul 26 din semnalul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de concatenare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de concatenare este &amp;quot;{&amp;quot; și &amp;quot;}&amp;quot;. Astfel, o serie de semnale separate prin virgulă și închise între două acolade va rezulta într-un singur semnal de dimensiune egală cu suma dimensiunilor semnalelor componente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [3:0] a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic c;&lt;br /&gt;
logic [9:0] d;&lt;br /&gt;
&lt;br /&gt;
//semnalul d este format din concatenarea semnalelor a,b,c&lt;br /&gt;
//unde a este pe pozitia cea mai semnificativa si c&lt;br /&gt;
//pe pozitia cea mai putin semnificativa&lt;br /&gt;
assign d = {a,b,c};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de replicare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de replicare este folosit când se dorește replicarea unui semnal de un număr mare sau necunoscut de ori (dat ca parametru). Astfel, construcția &amp;#039;&amp;#039;&amp;#039;{n{m}}&amp;#039;&amp;#039;&amp;#039; reprezintă semnalul &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039;, multiplcat de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; ori.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic [7:0] c;&lt;br /&gt;
logic [15:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = {5{a}}; //b va lua valoarea data de a, replicata de 5 ori&lt;br /&gt;
assign d = {2{c}}; //d va lua valoarea lui c (8 biti) replicata de 2 ori&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Blocuri și operatori condiționali ===&lt;br /&gt;
&lt;br /&gt;
Condițiile se pot exprima în trei moduri:&lt;br /&gt;
* folosing operatorul condițional cunoscut din limbajul C (condiție &amp;#039;&amp;#039;&amp;#039;?&amp;#039;&amp;#039;&amp;#039; valoare_pentru_adevărat &amp;#039;&amp;#039;&amp;#039;:&amp;#039;&amp;#039;&amp;#039; valoare_pentru_fals);&lt;br /&gt;
* folosind construcția &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* folosind constructia &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; respectiv &amp;#039;&amp;#039;&amp;#039;casex - endcase&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;casez - endcase&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Operatorul condițional se poate utiliza în orice tip de bloc. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = a ? c : d; //daca a este adevarat (adica daca este egal cu 1), atunci b ia valoarea lui c, altfel, b ia valoarea lui d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocurile &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; se pot utiliza doar în blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    if(a) begin&lt;br /&gt;
        b = c;&lt;br /&gt;
    end else begin&lt;br /&gt;
        b = d;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemplu &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [1:0] a;&lt;br /&gt;
logic  [3:0] e;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
//daca a este egal cu 0, atunci e ia valoarea lui c&lt;br /&gt;
//daca a este egal cu 1, atunci e ia valoarea lui d&lt;br /&gt;
//in orice alt caz, b ia valoarea 0&lt;br /&gt;
always_comb begin&lt;br /&gt;
    case(a)&lt;br /&gt;
        2&amp;#039;b00: e = c;&lt;br /&gt;
        2&amp;#039;b01: e = d;&lt;br /&gt;
        default: e = 3&amp;#039;b000;&lt;br /&gt;
    endcase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7911</id>
		<title>SystemVerilog</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7911"/>
		<updated>2025-02-20T10:09:50Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Blocuri always secvențiale. Asignări non-blocante (non-blocking assignments) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Module (sintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
Limbajul SystemVerilog este structurat pe module. Fiecare modul reprezintă un circuit care implementează o anume funcție. De exemplu, un modul poate reprezenta un sumator, adică un circuit care are două intrări ce specifică cei doi operanzi și o ieșire ce reprezintă rezultatul adunării. Conținutul modulului reprezintă descrierea (structurală sau comportamentală) a porților care calculeaza suma celor două intrări. Prin urmare, definiția unui modul SystemVerilog are două părți:&lt;br /&gt;
* interfață - lista tuturor porturilor de intrare și ieșire ale circuitului, specificate prin nume și dimensiune;&lt;br /&gt;
* implementare - descrierea efectivă a circuitului care se folosește de valorile de intrare pentru a calcula valorile de ieșire;&lt;br /&gt;
&lt;br /&gt;
=== Interfața modulelor SystemVerilog ===&lt;br /&gt;
Interfața modulului &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; este prezentată mai jos. &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ca și în sistemul numeral zecimal, unde suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; cifre are nevoie de &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; cifre (9 + 9 = 18), și în sistemul binar, suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; biți va fi pe &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; biți.&lt;br /&gt;
[[Fișier:Adder_interface.svg|thumb|Reprezentarea interfetei modulului &amp;quot;Adder&amp;quot; (black box)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Cuvintele cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;endmodule&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; sunt folosite pentru a începe și a încheia definirea unui modul. Imediat după cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; urmează numele modulului. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Numele unui modul va începe cu literă mare.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După definirea numelui modulului, urmează lista de porturi, plasată între &amp;#039;&amp;#039;&amp;#039;paranteze rotunde&amp;#039;&amp;#039;&amp;#039; și separate prin &amp;#039;&amp;#039;&amp;#039;virgulă&amp;#039;&amp;#039;&amp;#039;. Cuvintele cheie acceptate sunt &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;output&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de ieșire), &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;input&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de intrare) și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port bidirecțional).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AA00&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Când aveți de ales în privința interfeței unui modul, se evită utilizarea semnalelor de tip &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;. Acestea introduc elemente de tip [http://en.wikipedia.org/wiki/Tri-state_buffer#Tri-state_Buffer Tri-state Buffer] care sunt ineficiente. O alternativă mai eficientă este definirea a două porturi, unul de intrare și unul de ieșire, cu nume similare (ex: &amp;#039;&amp;#039;data_in&amp;#039;&amp;#039; și &amp;#039;&amp;#039;data_out&amp;#039;&amp;#039;).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Întâi se definesc ieșirile, apoi intrările unui modul.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Porturile unui modul se scriu unul sub altul, pe câte o linie, aliniate cu un tab la dreapta față de cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După tipul portului, urmează dimensiunea acestuia, specificată în indecșii biților, unde cel mai puțin semnificativ bit are indexul 0. Spre exemplu, un semnal de 4 biți va avea următoarea specificație &amp;#039;&amp;#039;&amp;#039;[3:0]&amp;#039;&amp;#039;&amp;#039; (bitul cel mai semnificativ are indexul 3, cel mai puțin semnificativ 0, în total 4 biți). &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Semnalelor de un bit le lipsește specificația de dimensiune:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
input semnal_de_un_bit,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După lista de porturi aflată între paranteze, definirea interfeței se termină cu caracterul &amp;#039;&amp;#039;&amp;#039;;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Există module nesintetizabile (care nu au corespondent in porți logice), care sunt folosite ca &amp;quot;programe&amp;quot; de test în medii de simulare și se numesc module de test. Aceste module nu au porturi de intrare și ieșire și sunt utilizate doar pentru a da valori porturilor de intrare ale modulului care se testează, și de a verifica valorile de pe porturile de ieșire ale acestuia. În cazul acestor module, lista de porturi și parantezele rotunde aferente lipsesc:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module TestModule;&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementarea modulelor SystemVerilog ===&lt;br /&gt;
&lt;br /&gt;
Implementarea modulelor SystemVerilog se face prin blocuri. Aceste blocuri pot avea sau nu corespondent într-un ciruit fizic. Dacă toate blocurile unui modul au corespondent într-un circuit fizic, atunci modulul este sintetizabil și poate fi transformat într-un circuit fizic. Blocurile care pot genera construcții sintetizabile sunt de patru tipuri:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri de instanțiere&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;generate&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Blocurile care sunt întotdeauna nesintetizabile și sunt folosite exclusiv pentru simulare:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Nu orice bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; este sintetizabil. Există construcții valide sintactic dar care nu au corespondent unui circuit. Aceste blocuri pot fi simulate, dar nu pot fi utilizate pentru programarea unei plăci [[FPGA]].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ordinea blocurilor într-un modul nu contează.&lt;br /&gt;
&lt;br /&gt;
==== Cuvântul cheie &amp;quot;logic&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
In SystemVerilog, toate semnalele sunt de tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, indiferent de natura lor. În urma sintezei, semnalele vor deveni fire, latch-uri sau registre.&lt;br /&gt;
&lt;br /&gt;
Semnalele într-un modul SystemVerilog se definesc în felul următor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
logic [3:0] semnal;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Niciun element nu își poate schimba valoarea în mai mult de un bloc.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Adder.png|thumb|Modulul Adder implementat]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assign&amp;#039;&amp;#039;&amp;#039; este un cuvănt cheie care generează [[circuite combinaționale]]. Cum sumatorul este un [[circuite combinaționale|circuit combinațional]], îl putem implementa cu un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign out = in0 + in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; În general, un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; va genera un circuit sintetizabil. Există și excepții, atunci când operația dorită este prea complexă pentru a fi implementată printr-un circuit combinațional, în mod eficient. Spre exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
assign out = in0 / in1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nu este un cod sintetizabil pentru majoritatea tool-urilor de sinteză, dar funcționează perfect într-o simulare.&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinaționale ====&lt;br /&gt;
&lt;br /&gt;
Formatul pentru un bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinational este următorul:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    //...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un bloc de tip &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; este sensibil la modificare oricarui semnal din cadrul modulului unde a fost definit, iesirile comandate de acest bloc sunt recalculate la orice modificare a unui semnal de intrare.&lt;br /&gt;
&lt;br /&gt;
În acest caz, putem reface implementarea sumatorului folosind un bloc &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    out = in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; secvențiale. Asignări non-blocante (non-blocking assignments) ====&lt;br /&gt;
&lt;br /&gt;
[[Circuite secvențiale|Circuitele secvențiale]] sunt circuitele care sunt sincronizate de [[Circuite secvențiale#Semnalul de ceas|semnalul de ceas]]. Acest semnal este, de obicei, produs de un generator de ceas și se definește ca intrare pentru fiecare modul secvențial (în care există cel puțin un registru). Putem modifica exemplul anterior, astfel încât ieșirea modulului de sumare să fie sincronă (adică să se modifice doar pe frontul pozitiv de ceas). Astfel, în interfața modulului, apare și semnalul de ceas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementation here&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Pentru descrierea circuitelor secvențiale, se folosește întotdeauna un bloc &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:SyncedAdder.png|thumb|Modulul SyncedAdder]]&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; descrie un circuit secvențial și are în lista de sensitivități, de obicei, doar semnalul de ceas. Acesta este sensibil la o tranziție a semnalului de ceas (numită front), de obicei cea din 0 în 1 (numită frontul pozitiv, sau frontul crescător al ceasului). Astfel, putem implementa sumatorul sincron în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    out &amp;lt;= in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Cuvântul cheie care specifică frontul pozitiv al unui semnal este &amp;#039;&amp;#039;&amp;#039;posedge&amp;#039;&amp;#039;&amp;#039; iar cel pentru frontul negativ al semnalului este &amp;#039;&amp;#039;&amp;#039;negedge&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Observați operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; folosit pentru atribuirea sumei registrului destinație. Acesta NU este operatorul logic de &amp;#039;&amp;#039;mai mic sau egal&amp;#039;&amp;#039;, ci reprezintă un mod de atribuire care se numește non-blocantă. Diferența dintre atribuirea blocantă (&amp;#039;&amp;#039;&amp;#039;=&amp;#039;&amp;#039;&amp;#039;) și cea non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) este că cea de-a doua întâi evalueaza toate expresiile din partea dreaptă a operatorului de atribuire (în cazul de față, suma &amp;#039;&amp;#039;in0 + in1&amp;#039;&amp;#039;) și abia apoi asignează rezultatul registrului destinație. Spre exemplu, dacă dorim să inversăm valorile a două registre, &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; și &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;, astfel încât &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; să ia valoarea lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039; și invers, vom face în felul următor: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod corect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 &amp;lt;= reg1;&lt;br /&gt;
    reg1 &amp;lt;= reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modulul se va comporta conform așteptărilor. Operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; nu va bloca restul evaluărilor din blocul always și prin urmare toate asignările se fac simultan, după evaluarea expresiilor din partea dreaptă a operatorului. Pe de altă parte, dacă facem asignarea blocantă:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod incorect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 = reg1;&lt;br /&gt;
    reg1 = reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
aceasta va bloca restul operațiilor până când asignarea se termină. În acest caz, după primul front de ceas, ambele registre vor conține valoarea inițială a lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Operatorul de asignare non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) se folosește doar în blocuri &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; În același bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;, se folosește același tip de operator de asignare pentru toate operațiile. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Utilizați asignare non-blocantă pentru toate blocurile &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; care generează circuite secvențiale (sunt sincronizate de ceas) și asignare blocantă în toate celelalte cazuri. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri de instanțiere ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:adder4.png|thumb|Un sumator de patru numere format din trei sumatoare de două numere]]&lt;br /&gt;
&lt;br /&gt;
Odată definit un modul, acesta poate fi folosit de oricâte ori pe parcursul unuia sau mai multor proiecte. Acest sistem se numește instanțiere. Să luam, ca exemplu, un modul care trebuie să facă suma a 4 numere pe 3 biți. Putem să folosim în acest scop modulul &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; pe 4 biți definit mai sus, în configurația din figură. Observați că se utilizează același modul de trei ori. Este ineficient și inutil să scriem de trei ori implementarea modulului, așa că vom recurge la metoda instanțierii. Orice instanță a unui modul trebuie să aibă un nume unic, după cum și într-un limbaj de programare, variabilele de același fel trebuie sa aibă un nume unic.&lt;br /&gt;
&lt;br /&gt;
Se observă în continuare că există semnale (fire) în modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039;, care nu sunt nici intrări, nici ieșiri, și sunt folosite doar pentru conectarea modulelor &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; (cel roșu și cel verde). Aceste semnale sunt fire (&amp;#039;&amp;#039;&amp;#039;wire&amp;#039;&amp;#039;&amp;#039;) și trebuie declarate ca atare.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru instanțierea unui modul este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
NumeModulInstantiat numeInstanta(&lt;br /&gt;
    .nume_intrare_sau_iesire_0(nume_semnal_legat_la_intrare_sau_iesire_0),&lt;br /&gt;
    .nume_intrare_sau_iesire_1(nume_semnal_legat_la_intrare_sau_iesire_1),&lt;br /&gt;
    //...&lt;br /&gt;
    .nume_intrare_sau_iesire_n(nume_semnal_legat_la_intrare_sau_iesire_n),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Haideți deci să vedem cum arată codul SystemVerilog pentru modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [3:0] subsum0;&lt;br /&gt;
logic [3:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0(in0),        //la intrarea numita in0 a instantei adder0 se leaga intrarea in0 a modulului&lt;br /&gt;
    .in1(in1)         //la intrarea numita in1 a instantei adder0 se leaga intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0(in2),        //la intrarea numita in0 a instantei adder1 se leaga intrarea in2 a modulului&lt;br /&gt;
    .in1(in3)         //la intrarea numita in1 a instantei adder1 se leaga intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),        //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0),    //la intrarea numita in0 a instantei adder2 se leaga firul subsum0&lt;br /&gt;
    .in1(subsum1)     //la intrarea numita in1 a instantei adder2 se leaga firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Instanțele adder0 și adder1 au legate la intrări semnale de 3 biți și la ieșire legate fire de 4 biți, cu toate că porturile lor au 4, respectiv 5 biți (intrările și ieșirile). În acest caz, semnalele se leagă fiind aliniate la cel mai puțin semnificativ bit și se generează un mesaj de avertizare (port mismatch). Cu toate că programele folosite de noi acceptă codul de mai sus, există programe care nu acceptă astfel de construcții, și se opresc cu eroari. Ca să fim foarte riguroși, vom folosi operatorul de concatenare pentru a corecta codul în felul următor (mai multe despre operatori veți putea afla mai jos):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3,&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [4:0] subsum0; //definim firele pe 5 biți deoarece iesirea instantelor adder0 si adder1 este pe 5 biti&lt;br /&gt;
logic [4:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0({1&amp;#039;b0,in0}), //la intrarea numita in0 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in0 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in1})  //la intrarea numita in1 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0({1&amp;#039;b0,in2}), //la intrarea numita in0 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in2 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in3})  //la intrarea numita in1 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),           //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0[3:0]),  //la intrarea numita in0 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum0&lt;br /&gt;
    .in1(subsum1[3:0])   //la intrarea numita in1 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module de test (nesintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
[[Fișier:addertester.png|thumb|Modul de test pentru sumatorul pe 4 biți]]&lt;br /&gt;
&lt;br /&gt;
Modulele de test sunt folosite pentru verificarea funcționalității unui alt modul sintetizabil. Figura alăturată prezintă schema bloc pentru un modul de test pentru sumatorul pe 4 biți. Un modul de test generic urmărește câteva reguli clare:&lt;br /&gt;
&lt;br /&gt;
* pentru fiecare intrare a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu intrarea, folosite pentru a genera stimuli pentru circuit;&lt;br /&gt;
* pentru fiecare ieșire a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu ieșirea, folosite pentru verificarea comportamentului (de obicei prin afișarea de forme de undă);&lt;br /&gt;
* se instanțiază modulul de testat și se leagă variabilele definite anterior la intrările și ieșirile instanței;&lt;br /&gt;
* se scrie un generator de stimuli (un bloc &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;) în care se programeaza o secvență temporizată de tranziții pentru intrări;&lt;br /&gt;
* se folosește un software de simulare pentru a rula testul și a vedea formele de undă.&lt;br /&gt;
&lt;br /&gt;
Astfel, modulul de test pentru sumatorul pe 4 biți va arăta astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AdderTester;&lt;br /&gt;
&lt;br /&gt;
//this is the definition of variables and wires&lt;br /&gt;
//for driving signals  &lt;br /&gt;
logic [3:0] i0;&lt;br /&gt;
logic [3:0] i1;&lt;br /&gt;
logic [4:0] o;&lt;br /&gt;
&lt;br /&gt;
//this is where the stimuls is added for the module&lt;br /&gt;
initial begin&lt;br /&gt;
     i0 = 0;&lt;br /&gt;
     i1 = 0;&lt;br /&gt;
  #5 i0 = 3;&lt;br /&gt;
  #2 i0 = 2;&lt;br /&gt;
     i1 = 1;&lt;br /&gt;
  #3 i0 = 1;&lt;br /&gt;
     i1 = 5;&lt;br /&gt;
  #5 $stop();&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
//this is where the tested module is instantiated  &lt;br /&gt;
Adder deviceUnderTest(&lt;br /&gt;
  .out(o),&lt;br /&gt;
  .in0(i0),&lt;br /&gt;
  .in1(i1)&lt;br /&gt;
);  &lt;br /&gt;
  &lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; este folosit pentru a da valori intrărilor modulului de testat. El iși începe execuția la momentul de timp t = 0. Fiecare linie este executată la același moment de tip, până când este întâlnit operatorul #, care așteaptă trecerea unor unități de timp. Astfel, în exemplul de mai sus, primele două linii se execută la t = 0, linia 3 se execută la t = 5, liniile 4 și 5 la t = 7, liniile 6 și 7 la t = 10 și ultima linie, la t = 15. Apelul funcției $stop() determină sfârșitul simulării.&lt;br /&gt;
&lt;br /&gt;
=== Semnalul de ceas în module de test ===&lt;br /&gt;
&lt;br /&gt;
Cuvântul cheie &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este folosit pentru a executa o atribuire sau apel de funcție în mod repetat, până la sfârșitul simulării. Acesta este în particular folositor pentru a genera un semnal de ceas. Secvența următoare de cod generează un semnal de ceas cu perioada de două unități de timp:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
reg clock;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock = 0;&lt;br /&gt;
    forever #1 clock = !clock;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Regulă:&amp;lt;/font&amp;gt;Pentru circuitele secvențiale, modulul de test va avea două blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. Primul este similar celui de mai sus, și utilizat pentru generarea semnalului de ceas. Al doilea este folosit pentru generarea celorlalte semnale de intrare și directivei de oprire a simulării. Motivul pentru această segregare este faptul că instrucțiunea &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este blocantă (adică instrucțiunile puse după ea nu se execută). Toate blocurile &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; dintr-un modul de test se execută în paralel.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sintaxa SystemVerilog ==&lt;br /&gt;
&lt;br /&gt;
=== Constante ===&lt;br /&gt;
&lt;br /&gt;
Constantele sunt valori numerice. Pentru fiecare valoare, se specifică numărul de biți pe care reprezentată si baza în care este scrisă. Spre exemplu &amp;#039;&amp;#039;&amp;#039;8&amp;#039;b111&amp;#039;&amp;#039;&amp;#039; este o constantă pe 8 biți a cărei valoare în binar este 111 (adică în decimal, 7). În același fel, &amp;#039;&amp;#039;&amp;#039;16&amp;#039;d10&amp;#039;&amp;#039;&amp;#039; reprezintă valoarea 10 în decimal reprezentată pe 16 biți. Este posibilă specificarea valorii fără număr de biți sau bază (în care caz baza implicită este cea decimală, și numărul de biți este aproximat de către compilator).&lt;br /&gt;
&lt;br /&gt;
=== Operatori ===&lt;br /&gt;
&lt;br /&gt;
==== Operatori aritmetici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Adunare || + || a + b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Scădere || - || a - b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Înmulțire || * || a * b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Împărțire || / || a / b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori logici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Egal || == || a == b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Diferit || != || a != b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic || &amp;lt; || a &amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic sau egal || &amp;lt;= || a &amp;lt;= b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare || &amp;gt; || a &amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare sau egal || &amp;gt;= || a &amp;gt;= b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori binari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și || &amp;amp; || a &amp;amp; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv || ^ || a ^ b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Operatori unari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Negare || ~ || ~b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și pe biții unui semnal|| &amp;amp; || &amp;amp;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau pe biții unui semnal|| &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv pe biții unui semnal|| ^ || ^a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori de shiftare pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la stânga  || &amp;lt;&amp;lt; || a &amp;lt;&amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la dreapta  || &amp;gt;&amp;gt; || a &amp;gt;&amp;gt; b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de acces la biți ====&lt;br /&gt;
&lt;br /&gt;
Dându-se un semnal pe n biți, operatorul de access la o sub-secvență din biții semnalului este &amp;#039;&amp;#039;&amp;#039;[m:k]&amp;#039;&amp;#039;&amp;#039; unde m și k sunt indecșii biților doriți, cu n &amp;lt; m &amp;lt; k. Ca exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [31:0] un_registru;&lt;br /&gt;
logic [7:0] un_fir;&lt;br /&gt;
logic alt_fir;&lt;br /&gt;
&lt;br /&gt;
assign un_fir = un_registru[30:23]; //firul &amp;quot;un_fir&amp;quot; ia valoarea data de secventa de biti de la 23 la 30 din registrul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
assign alt_fir = un_fir[3];         //firul &amp;quot;alt_fir&amp;quot; va lua valoarea bitului 3 din semnalul &amp;quot;un_fir&amp;quot; care este bitul 26 din semnalul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de concatenare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de concatenare este &amp;quot;{&amp;quot; și &amp;quot;}&amp;quot;. Astfel, o serie de semnale separate prin virgulă și închise între două acolade va rezulta într-un singur semnal de dimensiune egală cu suma dimensiunilor semnalelor componente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [3:0] a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic c;&lt;br /&gt;
logic [9:0] d;&lt;br /&gt;
&lt;br /&gt;
//semnalul d este format din concatenarea semnalelor a,b,c&lt;br /&gt;
//unde a este pe pozitia cea mai semnificativa si c&lt;br /&gt;
//pe pozitia cea mai putin semnificativa&lt;br /&gt;
assign d = {a,b,c};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de replicare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de replicare este folosit când se dorește replicarea unui semnal de un număr mare sau necunoscut de ori (dat ca parametru). Astfel, construcția &amp;#039;&amp;#039;&amp;#039;{n{m}}&amp;#039;&amp;#039;&amp;#039; reprezintă semnalul &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039;, multiplcat de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; ori.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic [7:0] c;&lt;br /&gt;
logic [15:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = {5{a}}; //b va lua valoarea data de a, replicata de 5 ori&lt;br /&gt;
assign d = {2{c}}; //d va lua valoarea lui c (8 biti) replicata de 2 ori&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Blocuri și operatori condiționali ===&lt;br /&gt;
&lt;br /&gt;
Condițiile se pot exprima în trei moduri:&lt;br /&gt;
* folosing operatorul condițional cunoscut din limbajul C (condiție &amp;#039;&amp;#039;&amp;#039;?&amp;#039;&amp;#039;&amp;#039; valoare_pentru_adevărat &amp;#039;&amp;#039;&amp;#039;:&amp;#039;&amp;#039;&amp;#039; valoare_pentru_fals);&lt;br /&gt;
* folosind construcția &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* folosind constructia &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; respectiv &amp;#039;&amp;#039;&amp;#039;casex - endcase&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;casez - endcase&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Operatorul condițional se poate utiliza în orice tip de bloc. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = a ? c : d; //daca a este adevarat (adica daca este egal cu 1), atunci b ia valoarea lui c, altfel, b ia valoarea lui d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocurile &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; se pot utiliza doar în blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    if(a) begin&lt;br /&gt;
        b = c;&lt;br /&gt;
    end else begin&lt;br /&gt;
        b = d;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemplu &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [1:0] a;&lt;br /&gt;
logic  [3:0] e;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
//daca a este egal cu 0, atunci e ia valoarea lui c&lt;br /&gt;
//daca a este egal cu 1, atunci e ia valoarea lui d&lt;br /&gt;
//in orice alt caz, b ia valoarea 0&lt;br /&gt;
always_comb begin&lt;br /&gt;
    case(a)&lt;br /&gt;
        2&amp;#039;b00: e = c;&lt;br /&gt;
        2&amp;#039;b01: e = d;&lt;br /&gt;
        default: e = 3&amp;#039;b000;&lt;br /&gt;
    endcase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7910</id>
		<title>SystemVerilog</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7910"/>
		<updated>2025-02-20T10:08:58Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Blocuri always secvențiale. Asignări non-blocante (non-blocking assignments) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Module (sintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
Limbajul SystemVerilog este structurat pe module. Fiecare modul reprezintă un circuit care implementează o anume funcție. De exemplu, un modul poate reprezenta un sumator, adică un circuit care are două intrări ce specifică cei doi operanzi și o ieșire ce reprezintă rezultatul adunării. Conținutul modulului reprezintă descrierea (structurală sau comportamentală) a porților care calculeaza suma celor două intrări. Prin urmare, definiția unui modul SystemVerilog are două părți:&lt;br /&gt;
* interfață - lista tuturor porturilor de intrare și ieșire ale circuitului, specificate prin nume și dimensiune;&lt;br /&gt;
* implementare - descrierea efectivă a circuitului care se folosește de valorile de intrare pentru a calcula valorile de ieșire;&lt;br /&gt;
&lt;br /&gt;
=== Interfața modulelor SystemVerilog ===&lt;br /&gt;
Interfața modulului &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; este prezentată mai jos. &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ca și în sistemul numeral zecimal, unde suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; cifre are nevoie de &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; cifre (9 + 9 = 18), și în sistemul binar, suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; biți va fi pe &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; biți.&lt;br /&gt;
[[Fișier:Adder_interface.svg|thumb|Reprezentarea interfetei modulului &amp;quot;Adder&amp;quot; (black box)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Cuvintele cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;endmodule&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; sunt folosite pentru a începe și a încheia definirea unui modul. Imediat după cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; urmează numele modulului. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Numele unui modul va începe cu literă mare.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După definirea numelui modulului, urmează lista de porturi, plasată între &amp;#039;&amp;#039;&amp;#039;paranteze rotunde&amp;#039;&amp;#039;&amp;#039; și separate prin &amp;#039;&amp;#039;&amp;#039;virgulă&amp;#039;&amp;#039;&amp;#039;. Cuvintele cheie acceptate sunt &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;output&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de ieșire), &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;input&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de intrare) și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port bidirecțional).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AA00&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Când aveți de ales în privința interfeței unui modul, se evită utilizarea semnalelor de tip &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;. Acestea introduc elemente de tip [http://en.wikipedia.org/wiki/Tri-state_buffer#Tri-state_Buffer Tri-state Buffer] care sunt ineficiente. O alternativă mai eficientă este definirea a două porturi, unul de intrare și unul de ieșire, cu nume similare (ex: &amp;#039;&amp;#039;data_in&amp;#039;&amp;#039; și &amp;#039;&amp;#039;data_out&amp;#039;&amp;#039;).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Întâi se definesc ieșirile, apoi intrările unui modul.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Porturile unui modul se scriu unul sub altul, pe câte o linie, aliniate cu un tab la dreapta față de cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După tipul portului, urmează dimensiunea acestuia, specificată în indecșii biților, unde cel mai puțin semnificativ bit are indexul 0. Spre exemplu, un semnal de 4 biți va avea următoarea specificație &amp;#039;&amp;#039;&amp;#039;[3:0]&amp;#039;&amp;#039;&amp;#039; (bitul cel mai semnificativ are indexul 3, cel mai puțin semnificativ 0, în total 4 biți). &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Semnalelor de un bit le lipsește specificația de dimensiune:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
input semnal_de_un_bit,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După lista de porturi aflată între paranteze, definirea interfeței se termină cu caracterul &amp;#039;&amp;#039;&amp;#039;;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Există module nesintetizabile (care nu au corespondent in porți logice), care sunt folosite ca &amp;quot;programe&amp;quot; de test în medii de simulare și se numesc module de test. Aceste module nu au porturi de intrare și ieșire și sunt utilizate doar pentru a da valori porturilor de intrare ale modulului care se testează, și de a verifica valorile de pe porturile de ieșire ale acestuia. În cazul acestor module, lista de porturi și parantezele rotunde aferente lipsesc:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module TestModule;&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementarea modulelor SystemVerilog ===&lt;br /&gt;
&lt;br /&gt;
Implementarea modulelor SystemVerilog se face prin blocuri. Aceste blocuri pot avea sau nu corespondent într-un ciruit fizic. Dacă toate blocurile unui modul au corespondent într-un circuit fizic, atunci modulul este sintetizabil și poate fi transformat într-un circuit fizic. Blocurile care pot genera construcții sintetizabile sunt de patru tipuri:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri de instanțiere&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;generate&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Blocurile care sunt întotdeauna nesintetizabile și sunt folosite exclusiv pentru simulare:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Nu orice bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; este sintetizabil. Există construcții valide sintactic dar care nu au corespondent unui circuit. Aceste blocuri pot fi simulate, dar nu pot fi utilizate pentru programarea unei plăci [[FPGA]].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ordinea blocurilor într-un modul nu contează.&lt;br /&gt;
&lt;br /&gt;
==== Cuvântul cheie &amp;quot;logic&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
In SystemVerilog, toate semnalele sunt de tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, indiferent de natura lor. În urma sintezei, semnalele vor deveni fire, latch-uri sau registre.&lt;br /&gt;
&lt;br /&gt;
Semnalele într-un modul SystemVerilog se definesc în felul următor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
logic [3:0] semnal;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Niciun element nu își poate schimba valoarea în mai mult de un bloc.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Adder.png|thumb|Modulul Adder implementat]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assign&amp;#039;&amp;#039;&amp;#039; este un cuvănt cheie care generează [[circuite combinaționale]]. Cum sumatorul este un [[circuite combinaționale|circuit combinațional]], îl putem implementa cu un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign out = in0 + in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; În general, un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; va genera un circuit sintetizabil. Există și excepții, atunci când operația dorită este prea complexă pentru a fi implementată printr-un circuit combinațional, în mod eficient. Spre exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
assign out = in0 / in1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nu este un cod sintetizabil pentru majoritatea tool-urilor de sinteză, dar funcționează perfect într-o simulare.&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinaționale ====&lt;br /&gt;
&lt;br /&gt;
Formatul pentru un bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinational este următorul:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    //...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un bloc de tip &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; este sensibil la modificare oricarui semnal din cadrul modulului unde a fost definit, iesirile comandate de acest bloc sunt recalculate la orice modificare a unui semnal de intrare.&lt;br /&gt;
&lt;br /&gt;
În acest caz, putem reface implementarea sumatorului folosind un bloc &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    out = in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; secvențiale. Asignări non-blocante (non-blocking assignments) ====&lt;br /&gt;
&lt;br /&gt;
[[Circuite secvențiale|Circuitele secvențiale]] sunt circuitele care sunt sincronizate de [[Circuite secvențiale#Semnalul de ceas|semnalul de ceas]]. Acest semnal este, de obicei, produs de un generator de ceas și se definește ca intrare pentru fiecare modul secvențial (în care există cel puțin un registru). Putem modifica exemplul anterior, astfel încât ieșirea modulului de sumare să fie sincronă (adică să se modifice doar pe frontul pozitiv de ceas). Astfel, în interfața modulului, apare și semnalul de ceas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementation here&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Pentru descrierea circuitelor secvențiale, se folosește întotdeauna un bloc &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:SyncedAdder.png|thumb|Modulul SyncedAdder]]&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; descrie un circuit secvențial și are în lista de sensitivități, de obicei, doar semnalul de ceas. Acesta este sensibil la o tranziție a semnalului de ceas (numită front), de obicei cea cea din 0 în 1 (numită frontul pozitiv, sau frontul crescător al ceasului). Astfel, putem implementa sumatorul sincron în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    out &amp;lt;= in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Cuvântul cheie care specifică frontul pozitiv al unui semnal este &amp;#039;&amp;#039;&amp;#039;posedge&amp;#039;&amp;#039;&amp;#039; iar cel pentru frontul negativ al semnalului este &amp;#039;&amp;#039;&amp;#039;negedge&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Observați operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; folosit pentru atribuirea sumei registrului destinație. Acesta NU este operatorul logic de &amp;#039;&amp;#039;mai mic sau egal&amp;#039;&amp;#039;, ci reprezintă un mod de atribuire care se numește non-blocantă. Diferența dintre atribuirea blocantă (&amp;#039;&amp;#039;&amp;#039;=&amp;#039;&amp;#039;&amp;#039;) și cea non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) este că cea de-a doua întâi evalueaza toate expresiile din partea dreaptă a operatorului de atribuire (în cazul de față, suma &amp;#039;&amp;#039;in0 + in1&amp;#039;&amp;#039;) și abia apoi asignează rezultatul registrului destinație. Spre exemplu, dacă dorim să inversăm valorile a două registre, &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; și &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;, astfel încât &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; să ia valoarea lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039; și invers, vom face în felul următor: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod corect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 &amp;lt;= reg1;&lt;br /&gt;
    reg1 &amp;lt;= reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modulul se va comporta conform așteptărilor. Operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; nu va bloca restul evaluărilor din blocul always și prin urmare toate asignările se fac simultan, după evaluarea expresiilor din partea dreaptă a operatorului. Pe de altă parte, dacă facem asignarea blocantă:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod incorect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 = reg1;&lt;br /&gt;
    reg1 = reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
aceasta va bloca restul operațiilor până când asignarea se termină. În acest caz, după primul front de ceas, ambele registre vor conține valoarea inițială a lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Operatorul de asignare non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) se folosește doar în blocuri &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; În același bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;, se folosește același tip de operator de asignare pentru toate operațiile. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Utilizați asignare non-blocantă pentru toate blocurile &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; care generează circuite secvențiale (sunt sincronizate de ceas) și asignare blocantă în toate celelalte cazuri. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri de instanțiere ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:adder4.png|thumb|Un sumator de patru numere format din trei sumatoare de două numere]]&lt;br /&gt;
&lt;br /&gt;
Odată definit un modul, acesta poate fi folosit de oricâte ori pe parcursul unuia sau mai multor proiecte. Acest sistem se numește instanțiere. Să luam, ca exemplu, un modul care trebuie să facă suma a 4 numere pe 3 biți. Putem să folosim în acest scop modulul &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; pe 4 biți definit mai sus, în configurația din figură. Observați că se utilizează același modul de trei ori. Este ineficient și inutil să scriem de trei ori implementarea modulului, așa că vom recurge la metoda instanțierii. Orice instanță a unui modul trebuie să aibă un nume unic, după cum și într-un limbaj de programare, variabilele de același fel trebuie sa aibă un nume unic.&lt;br /&gt;
&lt;br /&gt;
Se observă în continuare că există semnale (fire) în modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039;, care nu sunt nici intrări, nici ieșiri, și sunt folosite doar pentru conectarea modulelor &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; (cel roșu și cel verde). Aceste semnale sunt fire (&amp;#039;&amp;#039;&amp;#039;wire&amp;#039;&amp;#039;&amp;#039;) și trebuie declarate ca atare.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru instanțierea unui modul este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
NumeModulInstantiat numeInstanta(&lt;br /&gt;
    .nume_intrare_sau_iesire_0(nume_semnal_legat_la_intrare_sau_iesire_0),&lt;br /&gt;
    .nume_intrare_sau_iesire_1(nume_semnal_legat_la_intrare_sau_iesire_1),&lt;br /&gt;
    //...&lt;br /&gt;
    .nume_intrare_sau_iesire_n(nume_semnal_legat_la_intrare_sau_iesire_n),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Haideți deci să vedem cum arată codul SystemVerilog pentru modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [3:0] subsum0;&lt;br /&gt;
logic [3:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0(in0),        //la intrarea numita in0 a instantei adder0 se leaga intrarea in0 a modulului&lt;br /&gt;
    .in1(in1)         //la intrarea numita in1 a instantei adder0 se leaga intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0(in2),        //la intrarea numita in0 a instantei adder1 se leaga intrarea in2 a modulului&lt;br /&gt;
    .in1(in3)         //la intrarea numita in1 a instantei adder1 se leaga intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),        //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0),    //la intrarea numita in0 a instantei adder2 se leaga firul subsum0&lt;br /&gt;
    .in1(subsum1)     //la intrarea numita in1 a instantei adder2 se leaga firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Instanțele adder0 și adder1 au legate la intrări semnale de 3 biți și la ieșire legate fire de 4 biți, cu toate că porturile lor au 4, respectiv 5 biți (intrările și ieșirile). În acest caz, semnalele se leagă fiind aliniate la cel mai puțin semnificativ bit și se generează un mesaj de avertizare (port mismatch). Cu toate că programele folosite de noi acceptă codul de mai sus, există programe care nu acceptă astfel de construcții, și se opresc cu eroari. Ca să fim foarte riguroși, vom folosi operatorul de concatenare pentru a corecta codul în felul următor (mai multe despre operatori veți putea afla mai jos):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3,&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [4:0] subsum0; //definim firele pe 5 biți deoarece iesirea instantelor adder0 si adder1 este pe 5 biti&lt;br /&gt;
logic [4:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0({1&amp;#039;b0,in0}), //la intrarea numita in0 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in0 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in1})  //la intrarea numita in1 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0({1&amp;#039;b0,in2}), //la intrarea numita in0 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in2 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in3})  //la intrarea numita in1 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),           //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0[3:0]),  //la intrarea numita in0 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum0&lt;br /&gt;
    .in1(subsum1[3:0])   //la intrarea numita in1 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module de test (nesintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
[[Fișier:addertester.png|thumb|Modul de test pentru sumatorul pe 4 biți]]&lt;br /&gt;
&lt;br /&gt;
Modulele de test sunt folosite pentru verificarea funcționalității unui alt modul sintetizabil. Figura alăturată prezintă schema bloc pentru un modul de test pentru sumatorul pe 4 biți. Un modul de test generic urmărește câteva reguli clare:&lt;br /&gt;
&lt;br /&gt;
* pentru fiecare intrare a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu intrarea, folosite pentru a genera stimuli pentru circuit;&lt;br /&gt;
* pentru fiecare ieșire a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu ieșirea, folosite pentru verificarea comportamentului (de obicei prin afișarea de forme de undă);&lt;br /&gt;
* se instanțiază modulul de testat și se leagă variabilele definite anterior la intrările și ieșirile instanței;&lt;br /&gt;
* se scrie un generator de stimuli (un bloc &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;) în care se programeaza o secvență temporizată de tranziții pentru intrări;&lt;br /&gt;
* se folosește un software de simulare pentru a rula testul și a vedea formele de undă.&lt;br /&gt;
&lt;br /&gt;
Astfel, modulul de test pentru sumatorul pe 4 biți va arăta astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AdderTester;&lt;br /&gt;
&lt;br /&gt;
//this is the definition of variables and wires&lt;br /&gt;
//for driving signals  &lt;br /&gt;
logic [3:0] i0;&lt;br /&gt;
logic [3:0] i1;&lt;br /&gt;
logic [4:0] o;&lt;br /&gt;
&lt;br /&gt;
//this is where the stimuls is added for the module&lt;br /&gt;
initial begin&lt;br /&gt;
     i0 = 0;&lt;br /&gt;
     i1 = 0;&lt;br /&gt;
  #5 i0 = 3;&lt;br /&gt;
  #2 i0 = 2;&lt;br /&gt;
     i1 = 1;&lt;br /&gt;
  #3 i0 = 1;&lt;br /&gt;
     i1 = 5;&lt;br /&gt;
  #5 $stop();&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
//this is where the tested module is instantiated  &lt;br /&gt;
Adder deviceUnderTest(&lt;br /&gt;
  .out(o),&lt;br /&gt;
  .in0(i0),&lt;br /&gt;
  .in1(i1)&lt;br /&gt;
);  &lt;br /&gt;
  &lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; este folosit pentru a da valori intrărilor modulului de testat. El iși începe execuția la momentul de timp t = 0. Fiecare linie este executată la același moment de tip, până când este întâlnit operatorul #, care așteaptă trecerea unor unități de timp. Astfel, în exemplul de mai sus, primele două linii se execută la t = 0, linia 3 se execută la t = 5, liniile 4 și 5 la t = 7, liniile 6 și 7 la t = 10 și ultima linie, la t = 15. Apelul funcției $stop() determină sfârșitul simulării.&lt;br /&gt;
&lt;br /&gt;
=== Semnalul de ceas în module de test ===&lt;br /&gt;
&lt;br /&gt;
Cuvântul cheie &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este folosit pentru a executa o atribuire sau apel de funcție în mod repetat, până la sfârșitul simulării. Acesta este în particular folositor pentru a genera un semnal de ceas. Secvența următoare de cod generează un semnal de ceas cu perioada de două unități de timp:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
reg clock;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock = 0;&lt;br /&gt;
    forever #1 clock = !clock;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Regulă:&amp;lt;/font&amp;gt;Pentru circuitele secvențiale, modulul de test va avea două blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. Primul este similar celui de mai sus, și utilizat pentru generarea semnalului de ceas. Al doilea este folosit pentru generarea celorlalte semnale de intrare și directivei de oprire a simulării. Motivul pentru această segregare este faptul că instrucțiunea &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este blocantă (adică instrucțiunile puse după ea nu se execută). Toate blocurile &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; dintr-un modul de test se execută în paralel.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sintaxa SystemVerilog ==&lt;br /&gt;
&lt;br /&gt;
=== Constante ===&lt;br /&gt;
&lt;br /&gt;
Constantele sunt valori numerice. Pentru fiecare valoare, se specifică numărul de biți pe care reprezentată si baza în care este scrisă. Spre exemplu &amp;#039;&amp;#039;&amp;#039;8&amp;#039;b111&amp;#039;&amp;#039;&amp;#039; este o constantă pe 8 biți a cărei valoare în binar este 111 (adică în decimal, 7). În același fel, &amp;#039;&amp;#039;&amp;#039;16&amp;#039;d10&amp;#039;&amp;#039;&amp;#039; reprezintă valoarea 10 în decimal reprezentată pe 16 biți. Este posibilă specificarea valorii fără număr de biți sau bază (în care caz baza implicită este cea decimală, și numărul de biți este aproximat de către compilator).&lt;br /&gt;
&lt;br /&gt;
=== Operatori ===&lt;br /&gt;
&lt;br /&gt;
==== Operatori aritmetici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Adunare || + || a + b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Scădere || - || a - b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Înmulțire || * || a * b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Împărțire || / || a / b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori logici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Egal || == || a == b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Diferit || != || a != b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic || &amp;lt; || a &amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic sau egal || &amp;lt;= || a &amp;lt;= b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare || &amp;gt; || a &amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare sau egal || &amp;gt;= || a &amp;gt;= b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori binari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și || &amp;amp; || a &amp;amp; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv || ^ || a ^ b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Operatori unari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Negare || ~ || ~b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și pe biții unui semnal|| &amp;amp; || &amp;amp;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau pe biții unui semnal|| &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv pe biții unui semnal|| ^ || ^a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori de shiftare pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la stânga  || &amp;lt;&amp;lt; || a &amp;lt;&amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la dreapta  || &amp;gt;&amp;gt; || a &amp;gt;&amp;gt; b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de acces la biți ====&lt;br /&gt;
&lt;br /&gt;
Dându-se un semnal pe n biți, operatorul de access la o sub-secvență din biții semnalului este &amp;#039;&amp;#039;&amp;#039;[m:k]&amp;#039;&amp;#039;&amp;#039; unde m și k sunt indecșii biților doriți, cu n &amp;lt; m &amp;lt; k. Ca exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [31:0] un_registru;&lt;br /&gt;
logic [7:0] un_fir;&lt;br /&gt;
logic alt_fir;&lt;br /&gt;
&lt;br /&gt;
assign un_fir = un_registru[30:23]; //firul &amp;quot;un_fir&amp;quot; ia valoarea data de secventa de biti de la 23 la 30 din registrul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
assign alt_fir = un_fir[3];         //firul &amp;quot;alt_fir&amp;quot; va lua valoarea bitului 3 din semnalul &amp;quot;un_fir&amp;quot; care este bitul 26 din semnalul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de concatenare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de concatenare este &amp;quot;{&amp;quot; și &amp;quot;}&amp;quot;. Astfel, o serie de semnale separate prin virgulă și închise între două acolade va rezulta într-un singur semnal de dimensiune egală cu suma dimensiunilor semnalelor componente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [3:0] a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic c;&lt;br /&gt;
logic [9:0] d;&lt;br /&gt;
&lt;br /&gt;
//semnalul d este format din concatenarea semnalelor a,b,c&lt;br /&gt;
//unde a este pe pozitia cea mai semnificativa si c&lt;br /&gt;
//pe pozitia cea mai putin semnificativa&lt;br /&gt;
assign d = {a,b,c};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de replicare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de replicare este folosit când se dorește replicarea unui semnal de un număr mare sau necunoscut de ori (dat ca parametru). Astfel, construcția &amp;#039;&amp;#039;&amp;#039;{n{m}}&amp;#039;&amp;#039;&amp;#039; reprezintă semnalul &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039;, multiplcat de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; ori.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic [7:0] c;&lt;br /&gt;
logic [15:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = {5{a}}; //b va lua valoarea data de a, replicata de 5 ori&lt;br /&gt;
assign d = {2{c}}; //d va lua valoarea lui c (8 biti) replicata de 2 ori&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Blocuri și operatori condiționali ===&lt;br /&gt;
&lt;br /&gt;
Condițiile se pot exprima în trei moduri:&lt;br /&gt;
* folosing operatorul condițional cunoscut din limbajul C (condiție &amp;#039;&amp;#039;&amp;#039;?&amp;#039;&amp;#039;&amp;#039; valoare_pentru_adevărat &amp;#039;&amp;#039;&amp;#039;:&amp;#039;&amp;#039;&amp;#039; valoare_pentru_fals);&lt;br /&gt;
* folosind construcția &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* folosind constructia &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; respectiv &amp;#039;&amp;#039;&amp;#039;casex - endcase&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;casez - endcase&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Operatorul condițional se poate utiliza în orice tip de bloc. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = a ? c : d; //daca a este adevarat (adica daca este egal cu 1), atunci b ia valoarea lui c, altfel, b ia valoarea lui d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocurile &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; se pot utiliza doar în blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    if(a) begin&lt;br /&gt;
        b = c;&lt;br /&gt;
    end else begin&lt;br /&gt;
        b = d;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemplu &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [1:0] a;&lt;br /&gt;
logic  [3:0] e;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
//daca a este egal cu 0, atunci e ia valoarea lui c&lt;br /&gt;
//daca a este egal cu 1, atunci e ia valoarea lui d&lt;br /&gt;
//in orice alt caz, b ia valoarea 0&lt;br /&gt;
always_comb begin&lt;br /&gt;
    case(a)&lt;br /&gt;
        2&amp;#039;b00: e = c;&lt;br /&gt;
        2&amp;#039;b01: e = d;&lt;br /&gt;
        default: e = 3&amp;#039;b000;&lt;br /&gt;
    endcase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7909</id>
		<title>SystemVerilog</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7909"/>
		<updated>2025-02-20T10:01:35Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Implementarea modulelor SystemVerilog */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Module (sintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
Limbajul SystemVerilog este structurat pe module. Fiecare modul reprezintă un circuit care implementează o anume funcție. De exemplu, un modul poate reprezenta un sumator, adică un circuit care are două intrări ce specifică cei doi operanzi și o ieșire ce reprezintă rezultatul adunării. Conținutul modulului reprezintă descrierea (structurală sau comportamentală) a porților care calculeaza suma celor două intrări. Prin urmare, definiția unui modul SystemVerilog are două părți:&lt;br /&gt;
* interfață - lista tuturor porturilor de intrare și ieșire ale circuitului, specificate prin nume și dimensiune;&lt;br /&gt;
* implementare - descrierea efectivă a circuitului care se folosește de valorile de intrare pentru a calcula valorile de ieșire;&lt;br /&gt;
&lt;br /&gt;
=== Interfața modulelor SystemVerilog ===&lt;br /&gt;
Interfața modulului &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; este prezentată mai jos. &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ca și în sistemul numeral zecimal, unde suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; cifre are nevoie de &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; cifre (9 + 9 = 18), și în sistemul binar, suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; biți va fi pe &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; biți.&lt;br /&gt;
[[Fișier:Adder_interface.svg|thumb|Reprezentarea interfetei modulului &amp;quot;Adder&amp;quot; (black box)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Cuvintele cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;endmodule&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; sunt folosite pentru a începe și a încheia definirea unui modul. Imediat după cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; urmează numele modulului. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Numele unui modul va începe cu literă mare.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După definirea numelui modulului, urmează lista de porturi, plasată între &amp;#039;&amp;#039;&amp;#039;paranteze rotunde&amp;#039;&amp;#039;&amp;#039; și separate prin &amp;#039;&amp;#039;&amp;#039;virgulă&amp;#039;&amp;#039;&amp;#039;. Cuvintele cheie acceptate sunt &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;output&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de ieșire), &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;input&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de intrare) și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port bidirecțional).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AA00&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Când aveți de ales în privința interfeței unui modul, se evită utilizarea semnalelor de tip &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;. Acestea introduc elemente de tip [http://en.wikipedia.org/wiki/Tri-state_buffer#Tri-state_Buffer Tri-state Buffer] care sunt ineficiente. O alternativă mai eficientă este definirea a două porturi, unul de intrare și unul de ieșire, cu nume similare (ex: &amp;#039;&amp;#039;data_in&amp;#039;&amp;#039; și &amp;#039;&amp;#039;data_out&amp;#039;&amp;#039;).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Întâi se definesc ieșirile, apoi intrările unui modul.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Porturile unui modul se scriu unul sub altul, pe câte o linie, aliniate cu un tab la dreapta față de cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După tipul portului, urmează dimensiunea acestuia, specificată în indecșii biților, unde cel mai puțin semnificativ bit are indexul 0. Spre exemplu, un semnal de 4 biți va avea următoarea specificație &amp;#039;&amp;#039;&amp;#039;[3:0]&amp;#039;&amp;#039;&amp;#039; (bitul cel mai semnificativ are indexul 3, cel mai puțin semnificativ 0, în total 4 biți). &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Semnalelor de un bit le lipsește specificația de dimensiune:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
input semnal_de_un_bit,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După lista de porturi aflată între paranteze, definirea interfeței se termină cu caracterul &amp;#039;&amp;#039;&amp;#039;;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Există module nesintetizabile (care nu au corespondent in porți logice), care sunt folosite ca &amp;quot;programe&amp;quot; de test în medii de simulare și se numesc module de test. Aceste module nu au porturi de intrare și ieșire și sunt utilizate doar pentru a da valori porturilor de intrare ale modulului care se testează, și de a verifica valorile de pe porturile de ieșire ale acestuia. În cazul acestor module, lista de porturi și parantezele rotunde aferente lipsesc:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module TestModule;&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementarea modulelor SystemVerilog ===&lt;br /&gt;
&lt;br /&gt;
Implementarea modulelor SystemVerilog se face prin blocuri. Aceste blocuri pot avea sau nu corespondent într-un ciruit fizic. Dacă toate blocurile unui modul au corespondent într-un circuit fizic, atunci modulul este sintetizabil și poate fi transformat într-un circuit fizic. Blocurile care pot genera construcții sintetizabile sunt de patru tipuri:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri de instanțiere&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;generate&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Blocurile care sunt întotdeauna nesintetizabile și sunt folosite exclusiv pentru simulare:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Nu orice bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; este sintetizabil. Există construcții valide sintactic dar care nu au corespondent unui circuit. Aceste blocuri pot fi simulate, dar nu pot fi utilizate pentru programarea unei plăci [[FPGA]].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ordinea blocurilor într-un modul nu contează.&lt;br /&gt;
&lt;br /&gt;
==== Cuvântul cheie &amp;quot;logic&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
In SystemVerilog, toate semnalele sunt de tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, indiferent de natura lor. În urma sintezei, semnalele vor deveni fire, latch-uri sau registre.&lt;br /&gt;
&lt;br /&gt;
Semnalele într-un modul SystemVerilog se definesc în felul următor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
logic [3:0] semnal;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Niciun element nu își poate schimba valoarea în mai mult de un bloc.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Adder.png|thumb|Modulul Adder implementat]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assign&amp;#039;&amp;#039;&amp;#039; este un cuvănt cheie care generează [[circuite combinaționale]]. Cum sumatorul este un [[circuite combinaționale|circuit combinațional]], îl putem implementa cu un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign out = in0 + in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; În general, un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; va genera un circuit sintetizabil. Există și excepții, atunci când operația dorită este prea complexă pentru a fi implementată printr-un circuit combinațional, în mod eficient. Spre exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
assign out = in0 / in1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nu este un cod sintetizabil pentru majoritatea tool-urilor de sinteză, dar funcționează perfect într-o simulare.&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinaționale ====&lt;br /&gt;
&lt;br /&gt;
Formatul pentru un bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinational este următorul:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    //...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un bloc de tip &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; este sensibil la modificare oricarui semnal din cadrul modulului unde a fost definit, iesirile comandate de acest bloc sunt recalculate la orice modificare a unui semnal de intrare.&lt;br /&gt;
&lt;br /&gt;
În acest caz, putem reface implementarea sumatorului folosind un bloc &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    out = in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; secvențiale. Asignări non-blocante (non-blocking assignments) ====&lt;br /&gt;
&lt;br /&gt;
[[Circuite secvențiale|Circuitele secvențiale]] sunt circuitele care sunt sincronizate de [[Circuite secvențiale#Semnalul de ceas|semnalul de ceas]]. Acest semnal este, de obicei, produs de un generator de ceas și se definește ca intrare pentru fiecare modul secvențial (în care există cel puțin un registru). Putem modifica exemplul anterior, astfel încât ieșirea modulului de sumare să fie sincronă (adică să se modifice doar pe frontul pozitiv de ceas). Astfel, în interfața modulului, apare și semnalul de ceas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementation here&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Pentru descrierea circuitelor secvențiale, se folosește întotdeauna un bloc &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:SyncedAdder.png|thumb|Modulul SyncedAdder]]&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; care descrie un circuit secvențial are în lista de sensitivități numai semnalul de ceas iar el nu este sensibil la orice tranziție a ceasului ci numai la unul din fronturi (de obicei cel pozitiv). Astfel, putem implementa sumatorul sincron în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    out &amp;lt;= in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Cuvântul cheie care specifică frontul pozitiv al unui semnal este &amp;#039;&amp;#039;&amp;#039;posedge&amp;#039;&amp;#039;&amp;#039; iar cel pentru frontul negativ al semnalului este &amp;#039;&amp;#039;&amp;#039;negedge&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Observați operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; folosit pentru atribuirea sumei registrului destinație. Acesta NU este operatorul logic de &amp;#039;&amp;#039;mai mic sau egal&amp;#039;&amp;#039;, ci reprezintă un mod de atribuire care se numește non-blocantă. Diferența dintre atribuirea blocantă (&amp;#039;&amp;#039;&amp;#039;=&amp;#039;&amp;#039;&amp;#039;) și cea non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) este că cea de-a doua întâi evalueaza toate expresiile din partea dreaptă a operatorului de atribuire (în cazul de față, suma &amp;#039;&amp;#039;in0 + in1&amp;#039;&amp;#039;) și abia apoi asignează rezultatul registrului destinație. Spre exemplu, dacă dorim să inversăm valorile a două registre, &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; și &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;, astfel încât &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; să ia valoarea lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039; și invers, vom face în felul următor: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod corect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 &amp;lt;= reg1;&lt;br /&gt;
    reg1 &amp;lt;= reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modulul se va comporta conform așteptărilor. Operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; nu va bloca restul evaluărilor din blocul always și prin urmare toate asignările se fac simultan, după evaluarea expresiilor din partea dreaptă a operatorului. Pe de altă parte, dacă facem asignarea blocantă:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod incorect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 = reg1;&lt;br /&gt;
    reg1 = reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
aceasta va bloca restul operațiilor până când asignarea se termină. În acest caz, după primul front de ceas, ambele registre vor conține valoarea inițială a lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Operatorul de asignare non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) se folosește doar în blocuri &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; În același bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;, se folosește același tip de operator de asignare pentru toate operațiile. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Utilizați asignare non-blocantă pentru toate blocurile &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; care generează circuite secvențiale (sunt sincronizate de ceas) și asignare blocantă în toate celelalte cazuri. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri de instanțiere ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:adder4.png|thumb|Un sumator de patru numere format din trei sumatoare de două numere]]&lt;br /&gt;
&lt;br /&gt;
Odată definit un modul, acesta poate fi folosit de oricâte ori pe parcursul unuia sau mai multor proiecte. Acest sistem se numește instanțiere. Să luam, ca exemplu, un modul care trebuie să facă suma a 4 numere pe 3 biți. Putem să folosim în acest scop modulul &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; pe 4 biți definit mai sus, în configurația din figură. Observați că se utilizează același modul de trei ori. Este ineficient și inutil să scriem de trei ori implementarea modulului, așa că vom recurge la metoda instanțierii. Orice instanță a unui modul trebuie să aibă un nume unic, după cum și într-un limbaj de programare, variabilele de același fel trebuie sa aibă un nume unic.&lt;br /&gt;
&lt;br /&gt;
Se observă în continuare că există semnale (fire) în modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039;, care nu sunt nici intrări, nici ieșiri, și sunt folosite doar pentru conectarea modulelor &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; (cel roșu și cel verde). Aceste semnale sunt fire (&amp;#039;&amp;#039;&amp;#039;wire&amp;#039;&amp;#039;&amp;#039;) și trebuie declarate ca atare.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru instanțierea unui modul este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
NumeModulInstantiat numeInstanta(&lt;br /&gt;
    .nume_intrare_sau_iesire_0(nume_semnal_legat_la_intrare_sau_iesire_0),&lt;br /&gt;
    .nume_intrare_sau_iesire_1(nume_semnal_legat_la_intrare_sau_iesire_1),&lt;br /&gt;
    //...&lt;br /&gt;
    .nume_intrare_sau_iesire_n(nume_semnal_legat_la_intrare_sau_iesire_n),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Haideți deci să vedem cum arată codul SystemVerilog pentru modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [3:0] subsum0;&lt;br /&gt;
logic [3:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0(in0),        //la intrarea numita in0 a instantei adder0 se leaga intrarea in0 a modulului&lt;br /&gt;
    .in1(in1)         //la intrarea numita in1 a instantei adder0 se leaga intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0(in2),        //la intrarea numita in0 a instantei adder1 se leaga intrarea in2 a modulului&lt;br /&gt;
    .in1(in3)         //la intrarea numita in1 a instantei adder1 se leaga intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),        //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0),    //la intrarea numita in0 a instantei adder2 se leaga firul subsum0&lt;br /&gt;
    .in1(subsum1)     //la intrarea numita in1 a instantei adder2 se leaga firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Instanțele adder0 și adder1 au legate la intrări semnale de 3 biți și la ieșire legate fire de 4 biți, cu toate că porturile lor au 4, respectiv 5 biți (intrările și ieșirile). În acest caz, semnalele se leagă fiind aliniate la cel mai puțin semnificativ bit și se generează un mesaj de avertizare (port mismatch). Cu toate că programele folosite de noi acceptă codul de mai sus, există programe care nu acceptă astfel de construcții, și se opresc cu eroari. Ca să fim foarte riguroși, vom folosi operatorul de concatenare pentru a corecta codul în felul următor (mai multe despre operatori veți putea afla mai jos):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3,&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [4:0] subsum0; //definim firele pe 5 biți deoarece iesirea instantelor adder0 si adder1 este pe 5 biti&lt;br /&gt;
logic [4:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0({1&amp;#039;b0,in0}), //la intrarea numita in0 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in0 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in1})  //la intrarea numita in1 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0({1&amp;#039;b0,in2}), //la intrarea numita in0 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in2 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in3})  //la intrarea numita in1 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),           //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0[3:0]),  //la intrarea numita in0 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum0&lt;br /&gt;
    .in1(subsum1[3:0])   //la intrarea numita in1 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module de test (nesintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
[[Fișier:addertester.png|thumb|Modul de test pentru sumatorul pe 4 biți]]&lt;br /&gt;
&lt;br /&gt;
Modulele de test sunt folosite pentru verificarea funcționalității unui alt modul sintetizabil. Figura alăturată prezintă schema bloc pentru un modul de test pentru sumatorul pe 4 biți. Un modul de test generic urmărește câteva reguli clare:&lt;br /&gt;
&lt;br /&gt;
* pentru fiecare intrare a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu intrarea, folosite pentru a genera stimuli pentru circuit;&lt;br /&gt;
* pentru fiecare ieșire a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu ieșirea, folosite pentru verificarea comportamentului (de obicei prin afișarea de forme de undă);&lt;br /&gt;
* se instanțiază modulul de testat și se leagă variabilele definite anterior la intrările și ieșirile instanței;&lt;br /&gt;
* se scrie un generator de stimuli (un bloc &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;) în care se programeaza o secvență temporizată de tranziții pentru intrări;&lt;br /&gt;
* se folosește un software de simulare pentru a rula testul și a vedea formele de undă.&lt;br /&gt;
&lt;br /&gt;
Astfel, modulul de test pentru sumatorul pe 4 biți va arăta astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AdderTester;&lt;br /&gt;
&lt;br /&gt;
//this is the definition of variables and wires&lt;br /&gt;
//for driving signals  &lt;br /&gt;
logic [3:0] i0;&lt;br /&gt;
logic [3:0] i1;&lt;br /&gt;
logic [4:0] o;&lt;br /&gt;
&lt;br /&gt;
//this is where the stimuls is added for the module&lt;br /&gt;
initial begin&lt;br /&gt;
     i0 = 0;&lt;br /&gt;
     i1 = 0;&lt;br /&gt;
  #5 i0 = 3;&lt;br /&gt;
  #2 i0 = 2;&lt;br /&gt;
     i1 = 1;&lt;br /&gt;
  #3 i0 = 1;&lt;br /&gt;
     i1 = 5;&lt;br /&gt;
  #5 $stop();&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
//this is where the tested module is instantiated  &lt;br /&gt;
Adder deviceUnderTest(&lt;br /&gt;
  .out(o),&lt;br /&gt;
  .in0(i0),&lt;br /&gt;
  .in1(i1)&lt;br /&gt;
);  &lt;br /&gt;
  &lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; este folosit pentru a da valori intrărilor modulului de testat. El iși începe execuția la momentul de timp t = 0. Fiecare linie este executată la același moment de tip, până când este întâlnit operatorul #, care așteaptă trecerea unor unități de timp. Astfel, în exemplul de mai sus, primele două linii se execută la t = 0, linia 3 se execută la t = 5, liniile 4 și 5 la t = 7, liniile 6 și 7 la t = 10 și ultima linie, la t = 15. Apelul funcției $stop() determină sfârșitul simulării.&lt;br /&gt;
&lt;br /&gt;
=== Semnalul de ceas în module de test ===&lt;br /&gt;
&lt;br /&gt;
Cuvântul cheie &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este folosit pentru a executa o atribuire sau apel de funcție în mod repetat, până la sfârșitul simulării. Acesta este în particular folositor pentru a genera un semnal de ceas. Secvența următoare de cod generează un semnal de ceas cu perioada de două unități de timp:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
reg clock;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock = 0;&lt;br /&gt;
    forever #1 clock = !clock;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Regulă:&amp;lt;/font&amp;gt;Pentru circuitele secvențiale, modulul de test va avea două blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. Primul este similar celui de mai sus, și utilizat pentru generarea semnalului de ceas. Al doilea este folosit pentru generarea celorlalte semnale de intrare și directivei de oprire a simulării. Motivul pentru această segregare este faptul că instrucțiunea &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este blocantă (adică instrucțiunile puse după ea nu se execută). Toate blocurile &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; dintr-un modul de test se execută în paralel.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sintaxa SystemVerilog ==&lt;br /&gt;
&lt;br /&gt;
=== Constante ===&lt;br /&gt;
&lt;br /&gt;
Constantele sunt valori numerice. Pentru fiecare valoare, se specifică numărul de biți pe care reprezentată si baza în care este scrisă. Spre exemplu &amp;#039;&amp;#039;&amp;#039;8&amp;#039;b111&amp;#039;&amp;#039;&amp;#039; este o constantă pe 8 biți a cărei valoare în binar este 111 (adică în decimal, 7). În același fel, &amp;#039;&amp;#039;&amp;#039;16&amp;#039;d10&amp;#039;&amp;#039;&amp;#039; reprezintă valoarea 10 în decimal reprezentată pe 16 biți. Este posibilă specificarea valorii fără număr de biți sau bază (în care caz baza implicită este cea decimală, și numărul de biți este aproximat de către compilator).&lt;br /&gt;
&lt;br /&gt;
=== Operatori ===&lt;br /&gt;
&lt;br /&gt;
==== Operatori aritmetici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Adunare || + || a + b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Scădere || - || a - b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Înmulțire || * || a * b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Împărțire || / || a / b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori logici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Egal || == || a == b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Diferit || != || a != b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic || &amp;lt; || a &amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic sau egal || &amp;lt;= || a &amp;lt;= b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare || &amp;gt; || a &amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare sau egal || &amp;gt;= || a &amp;gt;= b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori binari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și || &amp;amp; || a &amp;amp; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv || ^ || a ^ b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Operatori unari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Negare || ~ || ~b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și pe biții unui semnal|| &amp;amp; || &amp;amp;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau pe biții unui semnal|| &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv pe biții unui semnal|| ^ || ^a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori de shiftare pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la stânga  || &amp;lt;&amp;lt; || a &amp;lt;&amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la dreapta  || &amp;gt;&amp;gt; || a &amp;gt;&amp;gt; b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de acces la biți ====&lt;br /&gt;
&lt;br /&gt;
Dându-se un semnal pe n biți, operatorul de access la o sub-secvență din biții semnalului este &amp;#039;&amp;#039;&amp;#039;[m:k]&amp;#039;&amp;#039;&amp;#039; unde m și k sunt indecșii biților doriți, cu n &amp;lt; m &amp;lt; k. Ca exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [31:0] un_registru;&lt;br /&gt;
logic [7:0] un_fir;&lt;br /&gt;
logic alt_fir;&lt;br /&gt;
&lt;br /&gt;
assign un_fir = un_registru[30:23]; //firul &amp;quot;un_fir&amp;quot; ia valoarea data de secventa de biti de la 23 la 30 din registrul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
assign alt_fir = un_fir[3];         //firul &amp;quot;alt_fir&amp;quot; va lua valoarea bitului 3 din semnalul &amp;quot;un_fir&amp;quot; care este bitul 26 din semnalul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de concatenare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de concatenare este &amp;quot;{&amp;quot; și &amp;quot;}&amp;quot;. Astfel, o serie de semnale separate prin virgulă și închise între două acolade va rezulta într-un singur semnal de dimensiune egală cu suma dimensiunilor semnalelor componente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [3:0] a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic c;&lt;br /&gt;
logic [9:0] d;&lt;br /&gt;
&lt;br /&gt;
//semnalul d este format din concatenarea semnalelor a,b,c&lt;br /&gt;
//unde a este pe pozitia cea mai semnificativa si c&lt;br /&gt;
//pe pozitia cea mai putin semnificativa&lt;br /&gt;
assign d = {a,b,c};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de replicare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de replicare este folosit când se dorește replicarea unui semnal de un număr mare sau necunoscut de ori (dat ca parametru). Astfel, construcția &amp;#039;&amp;#039;&amp;#039;{n{m}}&amp;#039;&amp;#039;&amp;#039; reprezintă semnalul &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039;, multiplcat de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; ori.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic [7:0] c;&lt;br /&gt;
logic [15:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = {5{a}}; //b va lua valoarea data de a, replicata de 5 ori&lt;br /&gt;
assign d = {2{c}}; //d va lua valoarea lui c (8 biti) replicata de 2 ori&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Blocuri și operatori condiționali ===&lt;br /&gt;
&lt;br /&gt;
Condițiile se pot exprima în trei moduri:&lt;br /&gt;
* folosing operatorul condițional cunoscut din limbajul C (condiție &amp;#039;&amp;#039;&amp;#039;?&amp;#039;&amp;#039;&amp;#039; valoare_pentru_adevărat &amp;#039;&amp;#039;&amp;#039;:&amp;#039;&amp;#039;&amp;#039; valoare_pentru_fals);&lt;br /&gt;
* folosind construcția &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* folosind constructia &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; respectiv &amp;#039;&amp;#039;&amp;#039;casex - endcase&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;casez - endcase&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Operatorul condițional se poate utiliza în orice tip de bloc. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = a ? c : d; //daca a este adevarat (adica daca este egal cu 1), atunci b ia valoarea lui c, altfel, b ia valoarea lui d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocurile &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; se pot utiliza doar în blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    if(a) begin&lt;br /&gt;
        b = c;&lt;br /&gt;
    end else begin&lt;br /&gt;
        b = d;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemplu &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [1:0] a;&lt;br /&gt;
logic  [3:0] e;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
//daca a este egal cu 0, atunci e ia valoarea lui c&lt;br /&gt;
//daca a este egal cu 1, atunci e ia valoarea lui d&lt;br /&gt;
//in orice alt caz, b ia valoarea 0&lt;br /&gt;
always_comb begin&lt;br /&gt;
    case(a)&lt;br /&gt;
        2&amp;#039;b00: e = c;&lt;br /&gt;
        2&amp;#039;b01: e = d;&lt;br /&gt;
        default: e = 3&amp;#039;b000;&lt;br /&gt;
    endcase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7908</id>
		<title>SystemVerilog</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=SystemVerilog&amp;diff=7908"/>
		<updated>2025-02-20T09:56:36Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Module (sintetizabile) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Module (sintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
Limbajul SystemVerilog este structurat pe module. Fiecare modul reprezintă un circuit care implementează o anume funcție. De exemplu, un modul poate reprezenta un sumator, adică un circuit care are două intrări ce specifică cei doi operanzi și o ieșire ce reprezintă rezultatul adunării. Conținutul modulului reprezintă descrierea (structurală sau comportamentală) a porților care calculeaza suma celor două intrări. Prin urmare, definiția unui modul SystemVerilog are două părți:&lt;br /&gt;
* interfață - lista tuturor porturilor de intrare și ieșire ale circuitului, specificate prin nume și dimensiune;&lt;br /&gt;
* implementare - descrierea efectivă a circuitului care se folosește de valorile de intrare pentru a calcula valorile de ieșire;&lt;br /&gt;
&lt;br /&gt;
=== Interfața modulelor SystemVerilog ===&lt;br /&gt;
Interfața modulului &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; este prezentată mai jos. &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ca și în sistemul numeral zecimal, unde suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; cifre are nevoie de &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; cifre (9 + 9 = 18), și în sistemul binar, suma a două numere de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; biți va fi pe &amp;#039;&amp;#039;&amp;#039;n + 1&amp;#039;&amp;#039;&amp;#039; biți.&lt;br /&gt;
[[Fișier:Adder_interface.svg|thumb|Reprezentarea interfetei modulului &amp;quot;Adder&amp;quot; (black box)]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Cuvintele cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;endmodule&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; sunt folosite pentru a începe și a încheia definirea unui modul. Imediat după cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; urmează numele modulului. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Numele unui modul va începe cu literă mare.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După definirea numelui modulului, urmează lista de porturi, plasată între &amp;#039;&amp;#039;&amp;#039;paranteze rotunde&amp;#039;&amp;#039;&amp;#039; și separate prin &amp;#039;&amp;#039;&amp;#039;virgulă&amp;#039;&amp;#039;&amp;#039;. Cuvintele cheie acceptate sunt &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;output&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de ieșire), &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;input&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port de intrare) și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; (reprezentând un port bidirecțional).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#00AA00&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Când aveți de ales în privința interfeței unui modul, se evită utilizarea semnalelor de tip &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;inout&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;. Acestea introduc elemente de tip [http://en.wikipedia.org/wiki/Tri-state_buffer#Tri-state_Buffer Tri-state Buffer] care sunt ineficiente. O alternativă mai eficientă este definirea a două porturi, unul de intrare și unul de ieșire, cu nume similare (ex: &amp;#039;&amp;#039;data_in&amp;#039;&amp;#039; și &amp;#039;&amp;#039;data_out&amp;#039;&amp;#039;).&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Întâi se definesc ieșirile, apoi intrările unui modul.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;conventie&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;#0000AA&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Convenție:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Porturile unui modul se scriu unul sub altul, pe câte o linie, aliniate cu un tab la dreapta față de cuvântul cheie &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;module&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După tipul portului, urmează dimensiunea acestuia, specificată în indecșii biților, unde cel mai puțin semnificativ bit are indexul 0. Spre exemplu, un semnal de 4 biți va avea următoarea specificație &amp;#039;&amp;#039;&amp;#039;[3:0]&amp;#039;&amp;#039;&amp;#039; (bitul cel mai semnificativ are indexul 3, cel mai puțin semnificativ 0, în total 4 biți). &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Semnalelor de un bit le lipsește specificația de dimensiune:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
input semnal_de_un_bit,&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
După lista de porturi aflată între paranteze, definirea interfeței se termină cu caracterul &amp;#039;&amp;#039;&amp;#039;;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
#&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Există module nesintetizabile (care nu au corespondent in porți logice), care sunt folosite ca &amp;quot;programe&amp;quot; de test în medii de simulare și se numesc module de test. Aceste module nu au porturi de intrare și ieșire și sunt utilizate doar pentru a da valori porturilor de intrare ale modulului care se testează, și de a verifica valorile de pe porturile de ieșire ale acestuia. În cazul acestor module, lista de porturi și parantezele rotunde aferente lipsesc:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
module TestModule;&lt;br /&gt;
&lt;br /&gt;
//implementare&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Implementarea modulelor SystemVerilog ===&lt;br /&gt;
&lt;br /&gt;
Implementarea modulelor SystemVerilog se face prin blocuri. Aceste blocuri pot avea sau nu corespondent într-un ciruit fizic. Dacă toate blocurile unui modul au corespondent într-un circuit fizic, atunci modulul este sintetizabil și poate fi transformat într-un circuit fizic. Blocurile care pot genera construcții sintetizabile sunt de patru tipuri:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* blocuri de instanțiere&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;generate&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
În SystemVerilog toate semnalele sunt de tip (&amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;), acesta acoperind atat fire cat si registre.&lt;br /&gt;
&lt;br /&gt;
Blocurile care sunt întotdeauna nesintetizabile și sunt folosite exclusiv pentru simulare:&lt;br /&gt;
* blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Nu orice bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; este sintetizabil. Există construcții valide sintactic dar care nu au corespondent în circuit. Aceste blocuri pot fi simulate dar nu pot fi utilizate pentru programarea unei plăci [[FPGA]].&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Ordinea blocurilor într-un modul nu contează.&lt;br /&gt;
&lt;br /&gt;
==== Cuvantul cheie &amp;quot;logic&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
In SystemVerilog, toate semnalele sunt de tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, indiferent de natura lor. In urma sintezei semnalele vor deveni fire, latch-uri sau registre.&lt;br /&gt;
&lt;br /&gt;
Semnalele într-un modul SystemVerilog se definesc în felul următor:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
logic [3:0] semnal;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Niciun element nu își poate schimba valoarea în mai mult de un bloc.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Adder.png|thumb|Modulul Adder implementat]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Assign&amp;#039;&amp;#039;&amp;#039; este un cuvănt cheie care generează [[circuite combinaționale]]. Cum sumatorul este un [[circuite combinaționale|circuit combinațional]], îl putem implementa cu un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
assign out = in0 + in1;&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; În general, un bloc &amp;#039;&amp;#039;&amp;#039;assign&amp;#039;&amp;#039;&amp;#039; va genera un circuit sintetizabil. Există și excepții, atunci când operația dorită este prea complexă pentru a fi implementată printr-un circuit combinațional, în mod eficient. Spre exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
assign out = in0 / in1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
nu este un cod sintetizabil pentru majoritatea tool-urilor de sinteză, dar funcționează perfect într-o simulare.&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinaționale ====&lt;br /&gt;
&lt;br /&gt;
Formatul pentru un bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; combinational este următorul:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    //...&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un bloc de tip &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; este sensibil la modificare oricarui semnal din cadrul modulului unde a fost definit, iesirile comandate de acest bloc sunt recalculate la orice modificare a unui semnal de intrare.&lt;br /&gt;
&lt;br /&gt;
În acest caz, putem reface implementarea sumatorului folosind un bloc &amp;#039;&amp;#039;&amp;#039;always_comb&amp;#039;&amp;#039;&amp;#039; în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    out = in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; secvențiale. Asignări non-blocante (non-blocking assignments) ====&lt;br /&gt;
&lt;br /&gt;
[[Circuite secvențiale|Circuitele secvențiale]] sunt circuitele care sunt sincronizate de [[Circuite secvențiale#Semnalul de ceas|semnalul de ceas]]. Acest semnal este, de obicei, produs de un generator de ceas și se definește ca intrare pentru fiecare modul secvențial (în care există cel puțin un registru). Putem modifica exemplul anterior, astfel încât ieșirea modulului de sumare să fie sincronă (adică să se modifice doar pe frontul pozitiv de ceas). Astfel, în interfața modulului, apare și semnalul de ceas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//implementation here&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Pentru descrierea circuitelor secvențiale, se folosește întotdeauna un bloc &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:SyncedAdder.png|thumb|Modulul SyncedAdder]]&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039; care descrie un circuit secvențial are în lista de sensitivități numai semnalul de ceas iar el nu este sensibil la orice tranziție a ceasului ci numai la unul din fronturi (de obicei cel pozitiv). Astfel, putem implementa sumatorul sincron în felul următor:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module SyncedAdder(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [3:0] in0,&lt;br /&gt;
    input logic [3:0] in1,&lt;br /&gt;
    input logic clock&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    out &amp;lt;= in0 + in1;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Cuvântul cheie care specifică frontul pozitiv al unui semnal este &amp;#039;&amp;#039;&amp;#039;posedge&amp;#039;&amp;#039;&amp;#039; iar cel pentru frontul negativ al semnalului este &amp;#039;&amp;#039;&amp;#039;negedge&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Observați operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; folosit pentru atribuirea sumei registrului destinație. Acesta NU este operatorul logic de &amp;#039;&amp;#039;mai mic sau egal&amp;#039;&amp;#039;, ci reprezintă un mod de atribuire care se numește non-blocantă. Diferența dintre atribuirea blocantă (&amp;#039;&amp;#039;&amp;#039;=&amp;#039;&amp;#039;&amp;#039;) și cea non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) este că cea de-a doua întâi evalueaza toate expresiile din partea dreaptă a operatorului de atribuire (în cazul de față, suma &amp;#039;&amp;#039;in0 + in1&amp;#039;&amp;#039;) și abia apoi asignează rezultatul registrului destinație. Spre exemplu, dacă dorim să inversăm valorile a două registre, &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; și &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;, astfel încât &amp;#039;&amp;#039;reg0&amp;#039;&amp;#039; să ia valoarea lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039; și invers, vom face în felul următor: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod corect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 &amp;lt;= reg1;&lt;br /&gt;
    reg1 &amp;lt;= reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modulul se va comporta conform așteptărilor. Operatorul &amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039; nu va bloca restul evaluărilor din blocul always și prin urmare toate asignările se fac simultan, după evaluarea expresiilor din partea dreaptă a operatorului. Pe de altă parte, dacă facem asignarea blocantă:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module RegSwapper(&lt;br /&gt;
    //...&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
logic [31:0] reg0;&lt;br /&gt;
logic [31:0] reg1;&lt;br /&gt;
&lt;br /&gt;
//cod incorect&lt;br /&gt;
always_ff@(posedge clock) begin&lt;br /&gt;
    reg0 = reg1;&lt;br /&gt;
    reg1 = reg0;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
aceasta va bloca restul operațiilor până când asignarea se termină. În acest caz, după primul front de ceas, ambele registre vor conține valoarea inițială a lui &amp;#039;&amp;#039;reg1&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Operatorul de asignare non-blocantă (&amp;#039;&amp;#039;&amp;#039;&amp;lt;=&amp;#039;&amp;#039;&amp;#039;) se folosește doar în blocuri &amp;#039;&amp;#039;&amp;#039;always_ff&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;always_latch&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Regulă:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; În același bloc &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;, se folosește același tip de operator de asignare pentru toate operațiile. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;sfat&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;font color=&amp;quot;green&amp;quot;&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Sfat:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/font&amp;gt; Utilizați asignare non-blocantă pentru toate blocurile &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039; care generează circuite secvențiale (sunt sincronizate de ceas) și asignare blocantă în toate celelalte cazuri. &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Blocuri de instanțiere ====&lt;br /&gt;
&lt;br /&gt;
[[Fișier:adder4.png|thumb|Un sumator de patru numere format din trei sumatoare de două numere]]&lt;br /&gt;
&lt;br /&gt;
Odată definit un modul, acesta poate fi folosit de oricâte ori pe parcursul unuia sau mai multor proiecte. Acest sistem se numește instanțiere. Să luam, ca exemplu, un modul care trebuie să facă suma a 4 numere pe 3 biți. Putem să folosim în acest scop modulul &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; pe 4 biți definit mai sus, în configurația din figură. Observați că se utilizează același modul de trei ori. Este ineficient și inutil să scriem de trei ori implementarea modulului, așa că vom recurge la metoda instanțierii. Orice instanță a unui modul trebuie să aibă un nume unic, după cum și într-un limbaj de programare, variabilele de același fel trebuie sa aibă un nume unic.&lt;br /&gt;
&lt;br /&gt;
Se observă în continuare că există semnale (fire) în modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039;, care nu sunt nici intrări, nici ieșiri, și sunt folosite doar pentru conectarea modulelor &amp;#039;&amp;#039;&amp;#039;Adder&amp;#039;&amp;#039;&amp;#039; (cel roșu și cel verde). Aceste semnale sunt fire (&amp;#039;&amp;#039;&amp;#039;wire&amp;#039;&amp;#039;&amp;#039;) și trebuie declarate ca atare.&lt;br /&gt;
&lt;br /&gt;
Sintaxa pentru instanțierea unui modul este următoarea:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
NumeModulInstantiat numeInstanta(&lt;br /&gt;
    .nume_intrare_sau_iesire_0(nume_semnal_legat_la_intrare_sau_iesire_0),&lt;br /&gt;
    .nume_intrare_sau_iesire_1(nume_semnal_legat_la_intrare_sau_iesire_1),&lt;br /&gt;
    //...&lt;br /&gt;
    .nume_intrare_sau_iesire_n(nume_semnal_legat_la_intrare_sau_iesire_n),&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Haideți deci să vedem cum arată codul SystemVerilog pentru modulul &amp;#039;&amp;#039;&amp;#039;Adder4&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [3:0] subsum0;&lt;br /&gt;
logic [3:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0(in0),        //la intrarea numita in0 a instantei adder0 se leaga intrarea in0 a modulului&lt;br /&gt;
    .in1(in1)         //la intrarea numita in1 a instantei adder0 se leaga intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0(in2),        //la intrarea numita in0 a instantei adder1 se leaga intrarea in2 a modulului&lt;br /&gt;
    .in1(in3)         //la intrarea numita in1 a instantei adder1 se leaga intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),        //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0),    //la intrarea numita in0 a instantei adder2 se leaga firul subsum0&lt;br /&gt;
    .in1(subsum1)     //la intrarea numita in1 a instantei adder2 se leaga firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; Instanțele adder0 și adder1 au legate la intrări semnale de 3 biți și la ieșire legate fire de 4 biți, cu toate că porturile lor au 4, respectiv 5 biți (intrările și ieșirile). În acest caz, semnalele se leagă fiind aliniate la cel mai puțin semnificativ bit și se generează un mesaj de avertizare (port mismatch). Cu toate că programele folosite de noi acceptă codul de mai sus, există programe care nu acceptă astfel de construcții, și se opresc cu eroari. Ca să fim foarte riguroși, vom folosi operatorul de concatenare pentru a corecta codul în felul următor (mai multe despre operatori veți putea afla mai jos):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Adder4(&lt;br /&gt;
    output logic [4:0] out,&lt;br /&gt;
    input logic [2:0] in0,&lt;br /&gt;
    input logic [2:0] in1,&lt;br /&gt;
    input logic [2:0] in2,&lt;br /&gt;
    input logic [2:0] in3,&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//definirea firelor de legatura&lt;br /&gt;
logic [4:0] subsum0; //definim firele pe 5 biți deoarece iesirea instantelor adder0 si adder1 este pe 5 biti&lt;br /&gt;
logic [4:0] subsum1;&lt;br /&gt;
&lt;br /&gt;
//instantierea modulelor&lt;br /&gt;
Adder adder0(&lt;br /&gt;
    .out(subsum0),    //iesirea numita out a instantei adder0 se leaga la firul subsum0&lt;br /&gt;
    .in0({1&amp;#039;b0,in0}), //la intrarea numita in0 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in0 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in1})  //la intrarea numita in1 a instantei adder0 se leaga un bit 0 concatenat cu intrarea in1 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder1(&lt;br /&gt;
    .out(subsum1),    //iesirea numita out a instantei adder1 se leaga la firul subsum1&lt;br /&gt;
    .in0({1&amp;#039;b0,in2}), //la intrarea numita in0 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in2 a modulului&lt;br /&gt;
    .in1({1&amp;#039;b0,in3})  //la intrarea numita in1 a instantei adder1 se leaga un bit 0 concatenat cu intrarea in3 a modulului&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
Adder adder2(&lt;br /&gt;
    .out(out),           //iesirea numita out a instantei adder2 se leaga la iesirea out a modulului&lt;br /&gt;
    .in0(subsum0[3:0]),  //la intrarea numita in0 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum0&lt;br /&gt;
    .in1(subsum1[3:0])   //la intrarea numita in1 a instantei adder2 se leaga cei mai putin semnificativ 4 biti din firul subsum1&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Module de test (nesintetizabile) ==&lt;br /&gt;
&lt;br /&gt;
[[Fișier:addertester.png|thumb|Modul de test pentru sumatorul pe 4 biți]]&lt;br /&gt;
&lt;br /&gt;
Modulele de test sunt folosite pentru verificarea funcționalității unui alt modul sintetizabil. Figura alăturată prezintă schema bloc pentru un modul de test pentru sumatorul pe 4 biți. Un modul de test generic urmărește câteva reguli clare:&lt;br /&gt;
&lt;br /&gt;
* pentru fiecare intrare a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu intrarea, folosite pentru a genera stimuli pentru circuit;&lt;br /&gt;
* pentru fiecare ieșire a modulului de testat, se definește o variabilă tip &amp;#039;&amp;#039;&amp;#039;logic&amp;#039;&amp;#039;&amp;#039;, de aceeași dimensiune cu ieșirea, folosite pentru verificarea comportamentului (de obicei prin afișarea de forme de undă);&lt;br /&gt;
* se instanțiază modulul de testat și se leagă variabilele definite anterior la intrările și ieșirile instanței;&lt;br /&gt;
* se scrie un generator de stimuli (un bloc &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;) în care se programeaza o secvență temporizată de tranziții pentru intrări;&lt;br /&gt;
* se folosește un software de simulare pentru a rula testul și a vedea formele de undă.&lt;br /&gt;
&lt;br /&gt;
Astfel, modulul de test pentru sumatorul pe 4 biți va arăta astfel:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module AdderTester;&lt;br /&gt;
&lt;br /&gt;
//this is the definition of variables and wires&lt;br /&gt;
//for driving signals  &lt;br /&gt;
logic [3:0] i0;&lt;br /&gt;
logic [3:0] i1;&lt;br /&gt;
logic [4:0] o;&lt;br /&gt;
&lt;br /&gt;
//this is where the stimuls is added for the module&lt;br /&gt;
initial begin&lt;br /&gt;
     i0 = 0;&lt;br /&gt;
     i1 = 0;&lt;br /&gt;
  #5 i0 = 3;&lt;br /&gt;
  #2 i0 = 2;&lt;br /&gt;
     i1 = 1;&lt;br /&gt;
  #3 i0 = 1;&lt;br /&gt;
     i1 = 5;&lt;br /&gt;
  #5 $stop();&lt;br /&gt;
end&lt;br /&gt;
  &lt;br /&gt;
//this is where the tested module is instantiated  &lt;br /&gt;
Adder deviceUnderTest(&lt;br /&gt;
  .out(o),&lt;br /&gt;
  .in0(i0),&lt;br /&gt;
  .in1(i1)&lt;br /&gt;
);  &lt;br /&gt;
  &lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocul &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; este folosit pentru a da valori intrărilor modulului de testat. El iși începe execuția la momentul de timp t = 0. Fiecare linie este executată la același moment de tip, până când este întâlnit operatorul #, care așteaptă trecerea unor unități de timp. Astfel, în exemplul de mai sus, primele două linii se execută la t = 0, linia 3 se execută la t = 5, liniile 4 și 5 la t = 7, liniile 6 și 7 la t = 10 și ultima linie, la t = 15. Apelul funcției $stop() determină sfârșitul simulării.&lt;br /&gt;
&lt;br /&gt;
=== Semnalul de ceas în module de test ===&lt;br /&gt;
&lt;br /&gt;
Cuvântul cheie &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este folosit pentru a executa o atribuire sau apel de funcție în mod repetat, până la sfârșitul simulării. Acesta este în particular folositor pentru a genera un semnal de ceas. Secvența următoare de cod generează un semnal de ceas cu perioada de două unități de timp:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
reg clock;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock = 0;&lt;br /&gt;
    forever #1 clock = !clock;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;regula&amp;quot;&amp;gt;&amp;lt;font color=&amp;quot;red&amp;quot;&amp;gt;Regulă:&amp;lt;/font&amp;gt;Pentru circuitele secvențiale, modulul de test va avea două blocuri &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039;. Primul este similar celui de mai sus, și utilizat pentru generarea semnalului de ceas. Al doilea este folosit pentru generarea celorlalte semnale de intrare și directivei de oprire a simulării. Motivul pentru această segregare este faptul că instrucțiunea &amp;#039;&amp;#039;&amp;#039;forever&amp;#039;&amp;#039;&amp;#039; este blocantă (adică instrucțiunile puse după ea nu se execută). Toate blocurile &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; dintr-un modul de test se execută în paralel.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sintaxa SystemVerilog ==&lt;br /&gt;
&lt;br /&gt;
=== Constante ===&lt;br /&gt;
&lt;br /&gt;
Constantele sunt valori numerice. Pentru fiecare valoare, se specifică numărul de biți pe care reprezentată si baza în care este scrisă. Spre exemplu &amp;#039;&amp;#039;&amp;#039;8&amp;#039;b111&amp;#039;&amp;#039;&amp;#039; este o constantă pe 8 biți a cărei valoare în binar este 111 (adică în decimal, 7). În același fel, &amp;#039;&amp;#039;&amp;#039;16&amp;#039;d10&amp;#039;&amp;#039;&amp;#039; reprezintă valoarea 10 în decimal reprezentată pe 16 biți. Este posibilă specificarea valorii fără număr de biți sau bază (în care caz baza implicită este cea decimală, și numărul de biți este aproximat de către compilator).&lt;br /&gt;
&lt;br /&gt;
=== Operatori ===&lt;br /&gt;
&lt;br /&gt;
==== Operatori aritmetici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Adunare || + || a + b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Scădere || - || a - b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Înmulțire || * || a * b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Împărțire || / || a / b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori logici ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Egal || == || a == b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Diferit || != || a != b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic || &amp;lt; || a &amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mic sau egal || &amp;lt;= || a &amp;lt;= b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare || &amp;gt; || a &amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Mai mare sau egal || &amp;gt;= || a &amp;gt;= b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori binari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și || &amp;amp; || a &amp;amp; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || a &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv || ^ || a ^ b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Operatori unari logici pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Negare || ~ || ~b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Și pe biții unui semnal|| &amp;amp; || &amp;amp;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau pe biții unui semnal|| &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; || &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;a&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Sau exclusiv pe biții unui semnal|| ^ || ^a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatori de shiftare pe biți ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Operație&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Operator&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Exemplu&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la stânga  || &amp;lt;&amp;lt; || a &amp;lt;&amp;lt; b&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Shiftare la dreapta  || &amp;gt;&amp;gt; || a &amp;gt;&amp;gt; b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de acces la biți ====&lt;br /&gt;
&lt;br /&gt;
Dându-se un semnal pe n biți, operatorul de access la o sub-secvență din biții semnalului este &amp;#039;&amp;#039;&amp;#039;[m:k]&amp;#039;&amp;#039;&amp;#039; unde m și k sunt indecșii biților doriți, cu n &amp;lt; m &amp;lt; k. Ca exemplu:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [31:0] un_registru;&lt;br /&gt;
logic [7:0] un_fir;&lt;br /&gt;
logic alt_fir;&lt;br /&gt;
&lt;br /&gt;
assign un_fir = un_registru[30:23]; //firul &amp;quot;un_fir&amp;quot; ia valoarea data de secventa de biti de la 23 la 30 din registrul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
assign alt_fir = un_fir[3];         //firul &amp;quot;alt_fir&amp;quot; va lua valoarea bitului 3 din semnalul &amp;quot;un_fir&amp;quot; care este bitul 26 din semnalul &amp;quot;un_registru&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de concatenare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de concatenare este &amp;quot;{&amp;quot; și &amp;quot;}&amp;quot;. Astfel, o serie de semnale separate prin virgulă și închise între două acolade va rezulta într-un singur semnal de dimensiune egală cu suma dimensiunilor semnalelor componente.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [3:0] a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic c;&lt;br /&gt;
logic [9:0] d;&lt;br /&gt;
&lt;br /&gt;
//semnalul d este format din concatenarea semnalelor a,b,c&lt;br /&gt;
//unde a este pe pozitia cea mai semnificativa si c&lt;br /&gt;
//pe pozitia cea mai putin semnificativa&lt;br /&gt;
assign d = {a,b,c};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Operatorul de replicare ====&lt;br /&gt;
&lt;br /&gt;
Operatorul de replicare este folosit când se dorește replicarea unui semnal de un număr mare sau necunoscut de ori (dat ca parametru). Astfel, construcția &amp;#039;&amp;#039;&amp;#039;{n{m}}&amp;#039;&amp;#039;&amp;#039; reprezintă semnalul &amp;#039;&amp;#039;&amp;#039;m&amp;#039;&amp;#039;&amp;#039;, multiplcat de &amp;#039;&amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;#039; ori.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [4:0] b;&lt;br /&gt;
logic [7:0] c;&lt;br /&gt;
logic [15:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = {5{a}}; //b va lua valoarea data de a, replicata de 5 ori&lt;br /&gt;
assign d = {2{c}}; //d va lua valoarea lui c (8 biti) replicata de 2 ori&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Blocuri și operatori condiționali ===&lt;br /&gt;
&lt;br /&gt;
Condițiile se pot exprima în trei moduri:&lt;br /&gt;
* folosing operatorul condițional cunoscut din limbajul C (condiție &amp;#039;&amp;#039;&amp;#039;?&amp;#039;&amp;#039;&amp;#039; valoare_pentru_adevărat &amp;#039;&amp;#039;&amp;#039;:&amp;#039;&amp;#039;&amp;#039; valoare_pentru_fals);&lt;br /&gt;
* folosind construcția &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;;&lt;br /&gt;
* folosind constructia &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; respectiv &amp;#039;&amp;#039;&amp;#039;casex - endcase&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;casez - endcase&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Operatorul condițional se poate utiliza în orice tip de bloc. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
assign b = a ? c : d; //daca a este adevarat (adica daca este egal cu 1), atunci b ia valoarea lui c, altfel, b ia valoarea lui d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Blocurile &amp;#039;&amp;#039;&amp;#039;if - else&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039; se pot utiliza doar în blocuri &amp;#039;&amp;#039;&amp;#039;always&amp;#039;&amp;#039;&amp;#039;. Exemplu:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic a;&lt;br /&gt;
logic [3:0] b;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
always_comb begin&lt;br /&gt;
    if(a) begin&lt;br /&gt;
        b = c;&lt;br /&gt;
    end else begin&lt;br /&gt;
        b = d;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Exemplu &amp;#039;&amp;#039;&amp;#039;case - endcase&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
logic [1:0] a;&lt;br /&gt;
logic  [3:0] e;&lt;br /&gt;
logic [3:0] c;&lt;br /&gt;
logic [3:0] d;&lt;br /&gt;
&lt;br /&gt;
//daca a este egal cu 0, atunci e ia valoarea lui c&lt;br /&gt;
//daca a este egal cu 1, atunci e ia valoarea lui d&lt;br /&gt;
//in orice alt caz, b ia valoarea 0&lt;br /&gt;
always_comb begin&lt;br /&gt;
    case(a)&lt;br /&gt;
        2&amp;#039;b00: e = c;&lt;br /&gt;
        2&amp;#039;b01: e = d;&lt;br /&gt;
        default: e = 3&amp;#039;b000;&lt;br /&gt;
    endcase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Introducere._SystemVerilog_HDL&amp;diff=7907</id>
		<title>Introducere. SystemVerilog HDL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Introducere._SystemVerilog_HDL&amp;diff=7907"/>
		<updated>2025-02-20T09:54:36Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Verilog si SystemVerilog HDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introducere în Circuite Digitale ==&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Analogic_sig.png|thumb|Semnal analogic]]&lt;br /&gt;
&lt;br /&gt;
=== Semnale analogice ===&lt;br /&gt;
&lt;br /&gt;
Începând cu lecțiile de electrocinetică de la orele de fizică din liceu (surse de tensiune, rezistențe, condensatoare, bobine, etc.) și terminând cu orele de [[Dispozitive și Circuite Electronice]], sistemele studiate au fost formate din componente formând circuite analogice. Circuitele analogice sunt circuite în care mărimile studiate (curent, tensiune), variază continuu în anumite intervale. Un exemplu concret este un amplificator audio, care preia un semnal sonor analogic și îl amplifică pentru a putea fi transmis mai departe, la un sistem de boxe. Puteți vedea un exemplu de semnal analogic în figura alăturată. Desigur, această imagine este generată de un computer, care este un dispozitiv digital, astfel ea nu poate reprezenta un semnal analogic adevărat ci poate doar simula un astfel de semnal, cu o anumită precizie.&lt;br /&gt;
&lt;br /&gt;
=== Semnale digitale ===&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Sampled.signal.svg|thumb|Semnal eșantionat (discret în timp cu valori continue)]]&lt;br /&gt;
[[Fișier:Quantized.signal.svg|thumb|Semnal cuantizat (continuu în timp cu valori discrete)]]&lt;br /&gt;
[[Fișier:Digital.signal.svg|thumb|Semnal digital (cuantizat și eșantionat)]]&lt;br /&gt;
&lt;br /&gt;
Un semnal digital este o înșiruire de valori discrete, fiecare din aceste valori făcând parte dintr-o mulțime discretă de valori raționale. Transformarea unui semnal analogic într-un semnal digital, implică o pierdere de precizie. Să luăm spre exemplu un semnal analogic sinusiodal simplu, reprezentând variația în timp a tensiunii la bornele unui rezistor. Între momentele t=0 și t=1, funcția, fiind continuă, are o infinitate de valori, prin urmare este imposibil de a izola fiecare valoare în parte, șirul astfel obținut fiind infinit. Procedura, în această situație, este de a izola doar o parte din valori, la anumite momente de timp, numite eșantioane, astfel încât să obținem un șir finit de valori. Această procedură se numește [http://en.wikipedia.org/wiki/Sampling_(signal_processing) eșantionare], iar perioada de timp dintre două eșantioane succesive, poartă numele de perioadă de eșantionare. Cu cât perioada de eșantionare este mai mică (respectiv frecvența de eșantionare mai mare), cu atât semnalul digital obținut este o copie mai fidelă (pierdere mai mica de precizie) față de semnalul analogic original. Dacă totuși semnalul analogic este de bandă limitată (adică poate fi scris ca o sumă finită de semnale sinusoidale), atunci [http://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem teorema eșantionării] arată că dacă eșantionarea se face cu o frecvență de cel puțin de două ori mai mare decât frecvența maximă din spectrul semnalului, din seria de eșantioane se poate obține cu precizie de 100% semnalul analogic original.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Totuși, mai există o problemă. Semnalul fiind continuu, valorile eșantioanele se află într-un spațiu continuu, prin urmare de precizie infinită. Pentru a reduce precizia valorilor, se utilizează un procedeu numit [http://en.wikipedia.org/wiki/Quantization_(signal_processing) cuantizare]. Acest procedeu implică împărțirea intervalului de valori posibile pentru semnal în subdiviziuni. Cu cât aceste subdiviziuni sunt mai fine, cu atât valorile obținute prin cuantizare vor fi mai aproape de valorile reale ale semnalului original, dar vor fi reprezentate cu un număr mai pare de simboluri.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
În concluzie, un semnal digital este o înșiruire de numere, obținute prin eșantionarea și cuantizarea unui semnal analogic.&lt;br /&gt;
&lt;br /&gt;
=== Numere și simboluri. [http://en.wikipedia.org/wiki/Numeral_system Baze de numerație] ===&lt;br /&gt;
&lt;br /&gt;
După cum s-a observat în capitolul anterior, un semnal digital este o înșiruire de valori. Aceste valori sunt reprezentate folosind simboluri, aparținând unei baze de numerație. Cel mai simplu exemplu este cel cu care suntem obișnuiți cu toții, adică baza zecimală, folosind ca simboluri cifrele de la 0 la 9. Dar acesta nu este nici pe departe singurul. Alte exemple ar fi sistemul de numerație roman, unde se folosesc ca simboluri literele I, V, X, L, C, D și M, unde valoarea acestor simboluri intr-un număr depinde de ordinea lor. Același lucru îl putem spune și despre baza de numerație zecimala, unde, spre exemplu, simbolul 9 are altă valoare dacă se află pe prima poziție (9) decât dacă se află pe a doua (90). Ce este interesant de reținut este că, în ciuda asocierii mentale dintre simbolurile cu care am fost obișnuiți de mici să lucrăm și valorile numerice pe care acestea le exprimă, cele două noțiuni sunt complet distincte. Valoarea „zece” poate fi exprimată numeric în baza zecimala ca 10, în sistemul de numerație roman ca X, în sistemul hexazecimal ca A, în sistemul binar ca 1010, în cel octal ca 12, dar toate aceste reprezentări exprimă, de fapt, același număr.&lt;br /&gt;
&lt;br /&gt;
==== Sistemul de numerație binar ====&lt;br /&gt;
&lt;br /&gt;
După cum îi spune și numele, acest sistem utilizează doar două simboluri, de cele mai multe ori, acestea fiind 0 și 1. Prin urmare, un număr poate fi reprezentat în sistemul binar (numit și baza 2) ca o secvență de 0 și 1. Ordinea simbolurilor într-un număr scris în baza doi respectă aceleași reguli ca și numerele scrise în baza zecimală. Astfel, daca într-un număr zecimal, cifra 7 pe poziția 4 era echivalentă cu valoarea 7 * 10&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt;, unde 10 este egal cu numărul de simboluri distincte folosite, atunci în baza 2, un 1 pe pozitia 4 este echivalent cu valoarea 1 * 2&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt;. Aceasta este și regula de transformare a numerelor din baza 2 în baza 10. Prin urmare:&lt;br /&gt;
&lt;br /&gt;
1001010&amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt; = 1 * 2&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; + 0 * 2&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; + 0 * 2&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; + 1 * 2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; + 0 * 2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + 1 * 2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; + 0 * 2&amp;lt;sup&amp;gt;0&amp;lt;/sup&amp;gt; = 64 + 0 + 0 + 8 + 0 + 2 + 0 = 54&amp;lt;sub&amp;gt;(10)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Transformarea unui număr din baza zecimală în cea binară implică împărțirea repetată la 2 (numărul de simboluri ale bazei), unde deîmpărțitul la fiecare iterație este dat de câtul împărțirii anterioare. Operația se repetă cât timp câtul este diferit de 0. Numărul în baza binară este dat de secvența resturilor începând cu ultima împărțire și terminând cu prima.&lt;br /&gt;
&lt;br /&gt;
Avantajul sistemului binar este că numărul redus de simboluri face ca și numărul de operații posibile între două simboluri aleatoare să fie redus, prin urmare este ușor de imaginat o realizare fizică a unor circuite care să implementeze aceste operații. Dezavantajul este că pentru numere relativ mici, este nevoie de multe simboluri pentru reprezentare. Așadar, pentru flexibilitatea operației cu valori reprezentate cu multe simboluri, se utilizeaza baza de numerație hexazecimală, adică baza 16. După cum îi spune și numele, baza hexazecimală utilizează 16 simboluri: cifrele de la 0 la 9, și caracterele a, b, c, d, e și f. Utilizarea bazei 16 este avantajoasă datorită trecerii foarte ușoare între ea și baza 2. Astfel, la orice valoare reprezentată printr-o secvență de patru simboluri binare corespunde unul și numai un simbol hexazecimal.&lt;br /&gt;
&lt;br /&gt;
=== Computație și control ===&lt;br /&gt;
&lt;br /&gt;
Am ajuns deci la concluzia că se pot face calcule (computație) folosind doar două simboluri, corespunzătoare valorilor de zero și de unu. Avem la dispoziție o bază de numerație (baza doi), prin care se pot face calcule din cele mai complexe, cu aceeași acuratețe ca și cele din baza decimală. Dar pe lângă calculul efectiv, un sistem informatic trebuie să poată lua decizii, adică să poate evalua o expresie și să decidă valoarea acesteia de adevăr, operație de tipul general &amp;#039;&amp;#039;&amp;#039;if then else&amp;#039;&amp;#039;&amp;#039;. Cel mai simplu exemplu de funcție care nu se poate calcula fără luarea unei decizii, este funcția modul (de fapt, orice funcție cu ramuri). Aceasta este de forma:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Pascal&amp;quot;&amp;gt;&lt;br /&gt;
if (operand &amp;lt; 0) then (result = -operand) else (result = operand);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Expresia (operand &amp;lt; 0) este ceea ce se numește o expresie logică. Expresiile logice, în [http://en.wikipedia.org/wiki/Boolean_algebra algebra booleană], pot lua numai două valori: &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;adevărat&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;fals&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;. Aceste valori pot fi notate cu aceleași simboluri pe care le utilizăm pentru valori numerice în baza doi, adică &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; pentru valoarea de adevăr &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;fals (false)&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; pentru valoarea de adevăr &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;adevărat (true)&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Cum asupra valorilor numerice pot fi aplicați operatori numerici (adunare, scădere, înmulțire), și asupra valorilor logice, pot fi aplicați operatori logici (ȘI, SAU, NU, SAU EXCLUSIV). Aceștia sunt explicați în detaliu pe pagina Wikipedia a [http://en.wikipedia.org/wiki/Boolean_algebra algebrei booleane].&lt;br /&gt;
&lt;br /&gt;
Concluzia este că folosind aceleași două simboluri, putem face calcule, folosind algebra binară, dar putem exercita control asupra unei funcții, folosind algebra booleană. După cum simbolurile se suprapun pentru computație și control, și operatorii asociați pot avea aceeași formă, și atunci distincția se face doar prin interpretarea lor. Spre exemplu, tabelul cu rezultate pentru înmulțirea a două numere de un bit (operație numerică) arată în felul următor:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A * B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
În același timp, operația logică ȘI care întoarce 1 dacă și numai dacă ambii operanzi sunt 1 (mă duc la film DACĂ nu plouă ȘI am bani), are următorul tabel de adevăr:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A ȘI B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Se observă că cele două funcții sunt identice. În acest fel, distincția dintre valoare logică și valoare numerică (respectiv operator logic și operator numeric) ține de interpretarea valorilor de intrare (dacă acestea sunt valori logice sau numerice) iar implementarea operatorilor este identică (prin urmare circuitul asociat este identic).&lt;br /&gt;
&lt;br /&gt;
=== Circuite ===&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Not_gate.png|thumb|Simbol inversor(A - intrare, out - ieșire)]]&lt;br /&gt;
[[Fișier:CMOS_inverter.png|thumb|Inversor alcătuit din tranzistoare CMOS]]&lt;br /&gt;
&lt;br /&gt;
În electronica digitală, ca de fapt în toată ramura tehnologiei care lucrează cu circuite digitale (adică calculatoare) ca și în teroria informației, un element care poate lua o valoare binară asociată unui simbol binar, se numește [http://en.wikipedia.org/wiki/Bit bit]. Baza circuitelor digitale, oricât de complexe, este dată de sub-circuitele care calculează operațiile unare și binare (adică care care au unul respectiv doi operanzi) între doi biți. Un astfel de sub-circuit se numește poartă (en:[http://en.wikipedia.org/wiki/Logic_gate gate]). Aceeași poartă poate fi considerată implementarea unui operator numeric de un bit, dar și implementarea unui operator logic.&lt;br /&gt;
&lt;br /&gt;
Modul de codare a valorilor asociate simbolurilor binare, în electronica digitală, este printr-o diferență de potențial între două puncte. În tehnologia curentă utilizată ([http://en.wikipedia.org/wiki/CMOS CMOS]), o tensiune între 0 și Vdd/2 este asociată valorii binare de 0 iar o tensiune între Vdd/2 și Vdd valorii binare de 1.[http://en.wikipedia.org/wiki/Logic_level]&lt;br /&gt;
&lt;br /&gt;
Cea mai simplă poartă este cea care implementează operația logică de negare (are o singură intrare și o singură ieșire care este intotdeauna diferită de cea de intrare, adică pentru intrarea 0, ieșirea este 1 și pentru intrarea 1, ieșirea este 0). Această poartă se numește inversor, sau poartă NU (en: [http://en.wikipedia.org/wiki/Inverter_(logic_gate) inverter], NOT gate).&lt;br /&gt;
&lt;br /&gt;
Simbolurile și tabelele de adevăr pentru cele mai utilizare porți:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tip !! Simbol !! Tabel de adevăr !! Tip !! Simbol !! Tabel de adevăr&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;AND&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:and.png|AND symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A AND B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;OR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:or.png|OR symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A OR B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;NOT&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:not.png|NOT symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || NOT A&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0&lt;br /&gt;
|}&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;NAND&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:nand.png|NAND symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A NAND B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 0&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;NOR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:nor.png|NOR symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A NOR B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 0&lt;br /&gt;
|}&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;XOR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:xor.png|XOR symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A XOR B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 0&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;XNOR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:xnor.png|XNOR symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A XNOR B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ca și la reprezentarea simbolică a amplificatoarelor operaționale, se observă că nici porțile logice nu au reprezentate porturile de alimentare (Vdd și Vss), vizibile pe schema inversorului CMOS. Acestea se consideră implicit conectate la sursa de alimentare, respectiv la masă.&lt;br /&gt;
&lt;br /&gt;
== Verilog si SystemVerilog HDL ==&lt;br /&gt;
&lt;br /&gt;
La ora actuală, un circuit digital poate ajunge până la 1 miliard de porți. Asta implică faptul că avem nevoie de unelte care să permită automatizarea procesului de design. Acest lucru se poate face folosind limbaje de descriere hardware ([http://en.wikipedia.org/wiki/Hardware_description_language Hardware Description Languages]). Aceste limbaje sunt special concepute pentru a putea descrie un circuit digital, ori din punct de vedere al comportamentului, ori din punct de vedere al structurii. În mod evident, o descriere comportamentală a unui circuit va fi mai succintă, dar nu va oferi informații despre structura dorită (la nivel de poartă), în timp ce o descriere structurală va fi mai exactă din punct de vedere al componentelor circuitului, dar mai lungă și poate mai dificil de înțeles.&lt;br /&gt;
&lt;br /&gt;
Există două limbaje foarte cunoscute de descriere hardware: [http://en.wikipedia.org/wiki/Verilog Verilog] și [http://en.wikipedia.org/wiki/VHDL VHDL]. În continuarea acestui laborator de Circuite Integrate Digitale, vom folosi pentru descriere circuitelor, limbajul Verilog. Sintaxa acestuia este simplă și este parțial moștenită din C. Totuși, este foarte important de reținut că Verilog nu este un limbaj de programare. El nu se „execută” secvențial de către un procesor, ci se sintetizeaza într-un circuit sau se simulează. Prin urmare utilizatorii de Verilog trebuie să se dezobișnuiască să gândească secvențial ca și cum fiecare linie de cod se execută după cea precedentă, si mai degrabă trebuie să-și imagineze cum funcționează circuitul pe care codul respectiv îl descrie. Astfel, diferența cea mai interesantă față de un limbaj de programare, este că ordinea blocurilor de cod dintr-un modul nu contează.&lt;br /&gt;
&lt;br /&gt;
SystemVerilog este o completare la standardul de bază Verilog și aduce multe imbunătățiri în direcția verificării circuitelor, cum ar fi conceptele de programare orientată pe obiecte. Pe langă acestea, apar și câteva imbunătățiri menite să ajute procesul de proiectare, cum ar fi o diferența mai clară și mai usor de urmărit dintre circuitele combinaționale și secvențiale.&lt;br /&gt;
&lt;br /&gt;
Înainte de a începe lucrul cu uneltele software de simulare și sinteză, parcurgeți tutorial-ul care explică sintaxa [[SystemVerilog]].&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Introducere._SystemVerilog_HDL&amp;diff=7906</id>
		<title>Introducere. SystemVerilog HDL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Introducere._SystemVerilog_HDL&amp;diff=7906"/>
		<updated>2025-02-20T09:53:13Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Verilog si SystemVerilog HDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introducere în Circuite Digitale ==&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Analogic_sig.png|thumb|Semnal analogic]]&lt;br /&gt;
&lt;br /&gt;
=== Semnale analogice ===&lt;br /&gt;
&lt;br /&gt;
Începând cu lecțiile de electrocinetică de la orele de fizică din liceu (surse de tensiune, rezistențe, condensatoare, bobine, etc.) și terminând cu orele de [[Dispozitive și Circuite Electronice]], sistemele studiate au fost formate din componente formând circuite analogice. Circuitele analogice sunt circuite în care mărimile studiate (curent, tensiune), variază continuu în anumite intervale. Un exemplu concret este un amplificator audio, care preia un semnal sonor analogic și îl amplifică pentru a putea fi transmis mai departe, la un sistem de boxe. Puteți vedea un exemplu de semnal analogic în figura alăturată. Desigur, această imagine este generată de un computer, care este un dispozitiv digital, astfel ea nu poate reprezenta un semnal analogic adevărat ci poate doar simula un astfel de semnal, cu o anumită precizie.&lt;br /&gt;
&lt;br /&gt;
=== Semnale digitale ===&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Sampled.signal.svg|thumb|Semnal eșantionat (discret în timp cu valori continue)]]&lt;br /&gt;
[[Fișier:Quantized.signal.svg|thumb|Semnal cuantizat (continuu în timp cu valori discrete)]]&lt;br /&gt;
[[Fișier:Digital.signal.svg|thumb|Semnal digital (cuantizat și eșantionat)]]&lt;br /&gt;
&lt;br /&gt;
Un semnal digital este o înșiruire de valori discrete, fiecare din aceste valori făcând parte dintr-o mulțime discretă de valori raționale. Transformarea unui semnal analogic într-un semnal digital, implică o pierdere de precizie. Să luăm spre exemplu un semnal analogic sinusiodal simplu, reprezentând variația în timp a tensiunii la bornele unui rezistor. Între momentele t=0 și t=1, funcția, fiind continuă, are o infinitate de valori, prin urmare este imposibil de a izola fiecare valoare în parte, șirul astfel obținut fiind infinit. Procedura, în această situație, este de a izola doar o parte din valori, la anumite momente de timp, numite eșantioane, astfel încât să obținem un șir finit de valori. Această procedură se numește [http://en.wikipedia.org/wiki/Sampling_(signal_processing) eșantionare], iar perioada de timp dintre două eșantioane succesive, poartă numele de perioadă de eșantionare. Cu cât perioada de eșantionare este mai mică (respectiv frecvența de eșantionare mai mare), cu atât semnalul digital obținut este o copie mai fidelă (pierdere mai mica de precizie) față de semnalul analogic original. Dacă totuși semnalul analogic este de bandă limitată (adică poate fi scris ca o sumă finită de semnale sinusoidale), atunci [http://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem teorema eșantionării] arată că dacă eșantionarea se face cu o frecvență de cel puțin de două ori mai mare decât frecvența maximă din spectrul semnalului, din seria de eșantioane se poate obține cu precizie de 100% semnalul analogic original.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Totuși, mai există o problemă. Semnalul fiind continuu, valorile eșantioanele se află într-un spațiu continuu, prin urmare de precizie infinită. Pentru a reduce precizia valorilor, se utilizează un procedeu numit [http://en.wikipedia.org/wiki/Quantization_(signal_processing) cuantizare]. Acest procedeu implică împărțirea intervalului de valori posibile pentru semnal în subdiviziuni. Cu cât aceste subdiviziuni sunt mai fine, cu atât valorile obținute prin cuantizare vor fi mai aproape de valorile reale ale semnalului original, dar vor fi reprezentate cu un număr mai pare de simboluri.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
În concluzie, un semnal digital este o înșiruire de numere, obținute prin eșantionarea și cuantizarea unui semnal analogic.&lt;br /&gt;
&lt;br /&gt;
=== Numere și simboluri. [http://en.wikipedia.org/wiki/Numeral_system Baze de numerație] ===&lt;br /&gt;
&lt;br /&gt;
După cum s-a observat în capitolul anterior, un semnal digital este o înșiruire de valori. Aceste valori sunt reprezentate folosind simboluri, aparținând unei baze de numerație. Cel mai simplu exemplu este cel cu care suntem obișnuiți cu toții, adică baza zecimală, folosind ca simboluri cifrele de la 0 la 9. Dar acesta nu este nici pe departe singurul. Alte exemple ar fi sistemul de numerație roman, unde se folosesc ca simboluri literele I, V, X, L, C, D și M, unde valoarea acestor simboluri intr-un număr depinde de ordinea lor. Același lucru îl putem spune și despre baza de numerație zecimala, unde, spre exemplu, simbolul 9 are altă valoare dacă se află pe prima poziție (9) decât dacă se află pe a doua (90). Ce este interesant de reținut este că, în ciuda asocierii mentale dintre simbolurile cu care am fost obișnuiți de mici să lucrăm și valorile numerice pe care acestea le exprimă, cele două noțiuni sunt complet distincte. Valoarea „zece” poate fi exprimată numeric în baza zecimala ca 10, în sistemul de numerație roman ca X, în sistemul hexazecimal ca A, în sistemul binar ca 1010, în cel octal ca 12, dar toate aceste reprezentări exprimă, de fapt, același număr.&lt;br /&gt;
&lt;br /&gt;
==== Sistemul de numerație binar ====&lt;br /&gt;
&lt;br /&gt;
După cum îi spune și numele, acest sistem utilizează doar două simboluri, de cele mai multe ori, acestea fiind 0 și 1. Prin urmare, un număr poate fi reprezentat în sistemul binar (numit și baza 2) ca o secvență de 0 și 1. Ordinea simbolurilor într-un număr scris în baza doi respectă aceleași reguli ca și numerele scrise în baza zecimală. Astfel, daca într-un număr zecimal, cifra 7 pe poziția 4 era echivalentă cu valoarea 7 * 10&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt;, unde 10 este egal cu numărul de simboluri distincte folosite, atunci în baza 2, un 1 pe pozitia 4 este echivalent cu valoarea 1 * 2&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt;. Aceasta este și regula de transformare a numerelor din baza 2 în baza 10. Prin urmare:&lt;br /&gt;
&lt;br /&gt;
1001010&amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt; = 1 * 2&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; + 0 * 2&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; + 0 * 2&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; + 1 * 2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; + 0 * 2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + 1 * 2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; + 0 * 2&amp;lt;sup&amp;gt;0&amp;lt;/sup&amp;gt; = 64 + 0 + 0 + 8 + 0 + 2 + 0 = 54&amp;lt;sub&amp;gt;(10)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Transformarea unui număr din baza zecimală în cea binară implică împărțirea repetată la 2 (numărul de simboluri ale bazei), unde deîmpărțitul la fiecare iterație este dat de câtul împărțirii anterioare. Operația se repetă cât timp câtul este diferit de 0. Numărul în baza binară este dat de secvența resturilor începând cu ultima împărțire și terminând cu prima.&lt;br /&gt;
&lt;br /&gt;
Avantajul sistemului binar este că numărul redus de simboluri face ca și numărul de operații posibile între două simboluri aleatoare să fie redus, prin urmare este ușor de imaginat o realizare fizică a unor circuite care să implementeze aceste operații. Dezavantajul este că pentru numere relativ mici, este nevoie de multe simboluri pentru reprezentare. Așadar, pentru flexibilitatea operației cu valori reprezentate cu multe simboluri, se utilizeaza baza de numerație hexazecimală, adică baza 16. După cum îi spune și numele, baza hexazecimală utilizează 16 simboluri: cifrele de la 0 la 9, și caracterele a, b, c, d, e și f. Utilizarea bazei 16 este avantajoasă datorită trecerii foarte ușoare între ea și baza 2. Astfel, la orice valoare reprezentată printr-o secvență de patru simboluri binare corespunde unul și numai un simbol hexazecimal.&lt;br /&gt;
&lt;br /&gt;
=== Computație și control ===&lt;br /&gt;
&lt;br /&gt;
Am ajuns deci la concluzia că se pot face calcule (computație) folosind doar două simboluri, corespunzătoare valorilor de zero și de unu. Avem la dispoziție o bază de numerație (baza doi), prin care se pot face calcule din cele mai complexe, cu aceeași acuratețe ca și cele din baza decimală. Dar pe lângă calculul efectiv, un sistem informatic trebuie să poată lua decizii, adică să poate evalua o expresie și să decidă valoarea acesteia de adevăr, operație de tipul general &amp;#039;&amp;#039;&amp;#039;if then else&amp;#039;&amp;#039;&amp;#039;. Cel mai simplu exemplu de funcție care nu se poate calcula fără luarea unei decizii, este funcția modul (de fapt, orice funcție cu ramuri). Aceasta este de forma:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Pascal&amp;quot;&amp;gt;&lt;br /&gt;
if (operand &amp;lt; 0) then (result = -operand) else (result = operand);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Expresia (operand &amp;lt; 0) este ceea ce se numește o expresie logică. Expresiile logice, în [http://en.wikipedia.org/wiki/Boolean_algebra algebra booleană], pot lua numai două valori: &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;adevărat&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;fals&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;. Aceste valori pot fi notate cu aceleași simboluri pe care le utilizăm pentru valori numerice în baza doi, adică &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; pentru valoarea de adevăr &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;fals (false)&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; pentru valoarea de adevăr &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;adevărat (true)&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Cum asupra valorilor numerice pot fi aplicați operatori numerici (adunare, scădere, înmulțire), și asupra valorilor logice, pot fi aplicați operatori logici (ȘI, SAU, NU, SAU EXCLUSIV). Aceștia sunt explicați în detaliu pe pagina Wikipedia a [http://en.wikipedia.org/wiki/Boolean_algebra algebrei booleane].&lt;br /&gt;
&lt;br /&gt;
Concluzia este că folosind aceleași două simboluri, putem face calcule, folosind algebra binară, dar putem exercita control asupra unei funcții, folosind algebra booleană. După cum simbolurile se suprapun pentru computație și control, și operatorii asociați pot avea aceeași formă, și atunci distincția se face doar prin interpretarea lor. Spre exemplu, tabelul cu rezultate pentru înmulțirea a două numere de un bit (operație numerică) arată în felul următor:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A * B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
În același timp, operația logică ȘI care întoarce 1 dacă și numai dacă ambii operanzi sunt 1 (mă duc la film DACĂ nu plouă ȘI am bani), are următorul tabel de adevăr:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A ȘI B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Se observă că cele două funcții sunt identice. În acest fel, distincția dintre valoare logică și valoare numerică (respectiv operator logic și operator numeric) ține de interpretarea valorilor de intrare (dacă acestea sunt valori logice sau numerice) iar implementarea operatorilor este identică (prin urmare circuitul asociat este identic).&lt;br /&gt;
&lt;br /&gt;
=== Circuite ===&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Not_gate.png|thumb|Simbol inversor(A - intrare, out - ieșire)]]&lt;br /&gt;
[[Fișier:CMOS_inverter.png|thumb|Inversor alcătuit din tranzistoare CMOS]]&lt;br /&gt;
&lt;br /&gt;
În electronica digitală, ca de fapt în toată ramura tehnologiei care lucrează cu circuite digitale (adică calculatoare) ca și în teroria informației, un element care poate lua o valoare binară asociată unui simbol binar, se numește [http://en.wikipedia.org/wiki/Bit bit]. Baza circuitelor digitale, oricât de complexe, este dată de sub-circuitele care calculează operațiile unare și binare (adică care care au unul respectiv doi operanzi) între doi biți. Un astfel de sub-circuit se numește poartă (en:[http://en.wikipedia.org/wiki/Logic_gate gate]). Aceeași poartă poate fi considerată implementarea unui operator numeric de un bit, dar și implementarea unui operator logic.&lt;br /&gt;
&lt;br /&gt;
Modul de codare a valorilor asociate simbolurilor binare, în electronica digitală, este printr-o diferență de potențial între două puncte. În tehnologia curentă utilizată ([http://en.wikipedia.org/wiki/CMOS CMOS]), o tensiune între 0 și Vdd/2 este asociată valorii binare de 0 iar o tensiune între Vdd/2 și Vdd valorii binare de 1.[http://en.wikipedia.org/wiki/Logic_level]&lt;br /&gt;
&lt;br /&gt;
Cea mai simplă poartă este cea care implementează operația logică de negare (are o singură intrare și o singură ieșire care este intotdeauna diferită de cea de intrare, adică pentru intrarea 0, ieșirea este 1 și pentru intrarea 1, ieșirea este 0). Această poartă se numește inversor, sau poartă NU (en: [http://en.wikipedia.org/wiki/Inverter_(logic_gate) inverter], NOT gate).&lt;br /&gt;
&lt;br /&gt;
Simbolurile și tabelele de adevăr pentru cele mai utilizare porți:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tip !! Simbol !! Tabel de adevăr !! Tip !! Simbol !! Tabel de adevăr&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;AND&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:and.png|AND symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A AND B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;OR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:or.png|OR symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A OR B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;NOT&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:not.png|NOT symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || NOT A&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0&lt;br /&gt;
|}&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;NAND&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:nand.png|NAND symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A NAND B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 0&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;NOR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:nor.png|NOR symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A NOR B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 0&lt;br /&gt;
|}&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;XOR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:xor.png|XOR symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A XOR B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 0&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;XNOR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:xnor.png|XNOR symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A XNOR B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ca și la reprezentarea simbolică a amplificatoarelor operaționale, se observă că nici porțile logice nu au reprezentate porturile de alimentare (Vdd și Vss), vizibile pe schema inversorului CMOS. Acestea se consideră implicit conectate la sursa de alimentare, respectiv la masă.&lt;br /&gt;
&lt;br /&gt;
== Verilog si SystemVerilog HDL ==&lt;br /&gt;
&lt;br /&gt;
La ora actuală, un circuit digital poate ajunge până la 1 miliard de porți. Asta implică faptul că avem nevoie de unelte care să permită automatizarea procesului de design. Acest lucru se poate face folosind limbaje de descriere hardware ([http://en.wikipedia.org/wiki/Hardware_description_language Hardware Description Languages]). Aceste limbaje sunt special concepute pentru a putea descrie un circuit digital, ori din punct de vedere al comportamentului, ori din punct de vedere al structurii. În mod evident, o descriere comportamentală a unui circuit va fi mai succintă, dar nu va oferi informații despre structura dorită (la nivel de poartă), în timp ce o descriere structurală va fi mai exactă din punct de vedere al componentelor circuitului, dar mai lungă și poate mai dificil de înțeles.&lt;br /&gt;
&lt;br /&gt;
Există două limbaje foarte cunoscute de descriere hardware: [http://en.wikipedia.org/wiki/Verilog Verilog] și [http://en.wikipedia.org/wiki/VHDL VHDL]. În continuarea acestui laborator de Circuite Integrate Digitale, vom folosi pentru descriere circuitelor, limbajul Verilog. Sintaxa acestuia este simplă și este parțial moștenită din C. Totuși, este foarte important de reținut că Verilog nu este un limbaj de programare. El nu se „execută” secvențial de către un procesor, ci se sintetizeaza într-un circuit sau se simulează. Prin urmare utilizatorii de Verilog trebuie să se dezobișnuiască să gândească secvențial ca și cum fiecare linie de cod se execută după cea precedentă, si mai degrabă trebuie să-și imagineze cum funcționează circuitul pe care codul respectiv îl descrie. Astfel, diferența cea mai interesantă față de un limbaj de programare, este că ordinea blocurilor de cod dintr-un modul nu contează.&lt;br /&gt;
&lt;br /&gt;
SystemVerilog este o completare la standardul de bază Verilog și aduce multe imbunătățiri în direcția verificării circuitelor, cum ar fi conceptele de programare orientată pe obiecte. Pe langă acestea, apar și câteva imbunătățiri menite să ajute procesul de proiectare, cum ar fi o diferența mai clară și mai usor de urmărit dintre circuitele combinaționale și secvențiale.&lt;br /&gt;
&lt;br /&gt;
Înainte de a începe lucrul cu uneltele software de simulare și sinteză, parcurgeți tutorial-ul care explică sintaxa [[Verilog]].&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Introducere._SystemVerilog_HDL&amp;diff=7905</id>
		<title>Introducere. SystemVerilog HDL</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Introducere._SystemVerilog_HDL&amp;diff=7905"/>
		<updated>2025-02-20T09:52:46Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Verilog si SystemVerilog HDL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introducere în Circuite Digitale ==&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Analogic_sig.png|thumb|Semnal analogic]]&lt;br /&gt;
&lt;br /&gt;
=== Semnale analogice ===&lt;br /&gt;
&lt;br /&gt;
Începând cu lecțiile de electrocinetică de la orele de fizică din liceu (surse de tensiune, rezistențe, condensatoare, bobine, etc.) și terminând cu orele de [[Dispozitive și Circuite Electronice]], sistemele studiate au fost formate din componente formând circuite analogice. Circuitele analogice sunt circuite în care mărimile studiate (curent, tensiune), variază continuu în anumite intervale. Un exemplu concret este un amplificator audio, care preia un semnal sonor analogic și îl amplifică pentru a putea fi transmis mai departe, la un sistem de boxe. Puteți vedea un exemplu de semnal analogic în figura alăturată. Desigur, această imagine este generată de un computer, care este un dispozitiv digital, astfel ea nu poate reprezenta un semnal analogic adevărat ci poate doar simula un astfel de semnal, cu o anumită precizie.&lt;br /&gt;
&lt;br /&gt;
=== Semnale digitale ===&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Sampled.signal.svg|thumb|Semnal eșantionat (discret în timp cu valori continue)]]&lt;br /&gt;
[[Fișier:Quantized.signal.svg|thumb|Semnal cuantizat (continuu în timp cu valori discrete)]]&lt;br /&gt;
[[Fișier:Digital.signal.svg|thumb|Semnal digital (cuantizat și eșantionat)]]&lt;br /&gt;
&lt;br /&gt;
Un semnal digital este o înșiruire de valori discrete, fiecare din aceste valori făcând parte dintr-o mulțime discretă de valori raționale. Transformarea unui semnal analogic într-un semnal digital, implică o pierdere de precizie. Să luăm spre exemplu un semnal analogic sinusiodal simplu, reprezentând variația în timp a tensiunii la bornele unui rezistor. Între momentele t=0 și t=1, funcția, fiind continuă, are o infinitate de valori, prin urmare este imposibil de a izola fiecare valoare în parte, șirul astfel obținut fiind infinit. Procedura, în această situație, este de a izola doar o parte din valori, la anumite momente de timp, numite eșantioane, astfel încât să obținem un șir finit de valori. Această procedură se numește [http://en.wikipedia.org/wiki/Sampling_(signal_processing) eșantionare], iar perioada de timp dintre două eșantioane succesive, poartă numele de perioadă de eșantionare. Cu cât perioada de eșantionare este mai mică (respectiv frecvența de eșantionare mai mare), cu atât semnalul digital obținut este o copie mai fidelă (pierdere mai mica de precizie) față de semnalul analogic original. Dacă totuși semnalul analogic este de bandă limitată (adică poate fi scris ca o sumă finită de semnale sinusoidale), atunci [http://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem teorema eșantionării] arată că dacă eșantionarea se face cu o frecvență de cel puțin de două ori mai mare decât frecvența maximă din spectrul semnalului, din seria de eșantioane se poate obține cu precizie de 100% semnalul analogic original.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Totuși, mai există o problemă. Semnalul fiind continuu, valorile eșantioanele se află într-un spațiu continuu, prin urmare de precizie infinită. Pentru a reduce precizia valorilor, se utilizează un procedeu numit [http://en.wikipedia.org/wiki/Quantization_(signal_processing) cuantizare]. Acest procedeu implică împărțirea intervalului de valori posibile pentru semnal în subdiviziuni. Cu cât aceste subdiviziuni sunt mai fine, cu atât valorile obținute prin cuantizare vor fi mai aproape de valorile reale ale semnalului original, dar vor fi reprezentate cu un număr mai pare de simboluri.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
În concluzie, un semnal digital este o înșiruire de numere, obținute prin eșantionarea și cuantizarea unui semnal analogic.&lt;br /&gt;
&lt;br /&gt;
=== Numere și simboluri. [http://en.wikipedia.org/wiki/Numeral_system Baze de numerație] ===&lt;br /&gt;
&lt;br /&gt;
După cum s-a observat în capitolul anterior, un semnal digital este o înșiruire de valori. Aceste valori sunt reprezentate folosind simboluri, aparținând unei baze de numerație. Cel mai simplu exemplu este cel cu care suntem obișnuiți cu toții, adică baza zecimală, folosind ca simboluri cifrele de la 0 la 9. Dar acesta nu este nici pe departe singurul. Alte exemple ar fi sistemul de numerație roman, unde se folosesc ca simboluri literele I, V, X, L, C, D și M, unde valoarea acestor simboluri intr-un număr depinde de ordinea lor. Același lucru îl putem spune și despre baza de numerație zecimala, unde, spre exemplu, simbolul 9 are altă valoare dacă se află pe prima poziție (9) decât dacă se află pe a doua (90). Ce este interesant de reținut este că, în ciuda asocierii mentale dintre simbolurile cu care am fost obișnuiți de mici să lucrăm și valorile numerice pe care acestea le exprimă, cele două noțiuni sunt complet distincte. Valoarea „zece” poate fi exprimată numeric în baza zecimala ca 10, în sistemul de numerație roman ca X, în sistemul hexazecimal ca A, în sistemul binar ca 1010, în cel octal ca 12, dar toate aceste reprezentări exprimă, de fapt, același număr.&lt;br /&gt;
&lt;br /&gt;
==== Sistemul de numerație binar ====&lt;br /&gt;
&lt;br /&gt;
După cum îi spune și numele, acest sistem utilizează doar două simboluri, de cele mai multe ori, acestea fiind 0 și 1. Prin urmare, un număr poate fi reprezentat în sistemul binar (numit și baza 2) ca o secvență de 0 și 1. Ordinea simbolurilor într-un număr scris în baza doi respectă aceleași reguli ca și numerele scrise în baza zecimală. Astfel, daca într-un număr zecimal, cifra 7 pe poziția 4 era echivalentă cu valoarea 7 * 10&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt;, unde 10 este egal cu numărul de simboluri distincte folosite, atunci în baza 2, un 1 pe pozitia 4 este echivalent cu valoarea 1 * 2&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt;. Aceasta este și regula de transformare a numerelor din baza 2 în baza 10. Prin urmare:&lt;br /&gt;
&lt;br /&gt;
1001010&amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt; = 1 * 2&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; + 0 * 2&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; + 0 * 2&amp;lt;sup&amp;gt;4&amp;lt;/sup&amp;gt; + 1 * 2&amp;lt;sup&amp;gt;3&amp;lt;/sup&amp;gt; + 0 * 2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; + 1 * 2&amp;lt;sup&amp;gt;1&amp;lt;/sup&amp;gt; + 0 * 2&amp;lt;sup&amp;gt;0&amp;lt;/sup&amp;gt; = 64 + 0 + 0 + 8 + 0 + 2 + 0 = 54&amp;lt;sub&amp;gt;(10)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Transformarea unui număr din baza zecimală în cea binară implică împărțirea repetată la 2 (numărul de simboluri ale bazei), unde deîmpărțitul la fiecare iterație este dat de câtul împărțirii anterioare. Operația se repetă cât timp câtul este diferit de 0. Numărul în baza binară este dat de secvența resturilor începând cu ultima împărțire și terminând cu prima.&lt;br /&gt;
&lt;br /&gt;
Avantajul sistemului binar este că numărul redus de simboluri face ca și numărul de operații posibile între două simboluri aleatoare să fie redus, prin urmare este ușor de imaginat o realizare fizică a unor circuite care să implementeze aceste operații. Dezavantajul este că pentru numere relativ mici, este nevoie de multe simboluri pentru reprezentare. Așadar, pentru flexibilitatea operației cu valori reprezentate cu multe simboluri, se utilizeaza baza de numerație hexazecimală, adică baza 16. După cum îi spune și numele, baza hexazecimală utilizează 16 simboluri: cifrele de la 0 la 9, și caracterele a, b, c, d, e și f. Utilizarea bazei 16 este avantajoasă datorită trecerii foarte ușoare între ea și baza 2. Astfel, la orice valoare reprezentată printr-o secvență de patru simboluri binare corespunde unul și numai un simbol hexazecimal.&lt;br /&gt;
&lt;br /&gt;
=== Computație și control ===&lt;br /&gt;
&lt;br /&gt;
Am ajuns deci la concluzia că se pot face calcule (computație) folosind doar două simboluri, corespunzătoare valorilor de zero și de unu. Avem la dispoziție o bază de numerație (baza doi), prin care se pot face calcule din cele mai complexe, cu aceeași acuratețe ca și cele din baza decimală. Dar pe lângă calculul efectiv, un sistem informatic trebuie să poată lua decizii, adică să poate evalua o expresie și să decidă valoarea acesteia de adevăr, operație de tipul general &amp;#039;&amp;#039;&amp;#039;if then else&amp;#039;&amp;#039;&amp;#039;. Cel mai simplu exemplu de funcție care nu se poate calcula fără luarea unei decizii, este funcția modul (de fapt, orice funcție cu ramuri). Aceasta este de forma:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Pascal&amp;quot;&amp;gt;&lt;br /&gt;
if (operand &amp;lt; 0) then (result = -operand) else (result = operand);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Expresia (operand &amp;lt; 0) este ceea ce se numește o expresie logică. Expresiile logice, în [http://en.wikipedia.org/wiki/Boolean_algebra algebra booleană], pot lua numai două valori: &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;adevărat&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;fals&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;. Aceste valori pot fi notate cu aceleași simboluri pe care le utilizăm pentru valori numerice în baza doi, adică &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; pentru valoarea de adevăr &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;fals (false)&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; pentru valoarea de adevăr &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;adevărat (true)&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Cum asupra valorilor numerice pot fi aplicați operatori numerici (adunare, scădere, înmulțire), și asupra valorilor logice, pot fi aplicați operatori logici (ȘI, SAU, NU, SAU EXCLUSIV). Aceștia sunt explicați în detaliu pe pagina Wikipedia a [http://en.wikipedia.org/wiki/Boolean_algebra algebrei booleane].&lt;br /&gt;
&lt;br /&gt;
Concluzia este că folosind aceleași două simboluri, putem face calcule, folosind algebra binară, dar putem exercita control asupra unei funcții, folosind algebra booleană. După cum simbolurile se suprapun pentru computație și control, și operatorii asociați pot avea aceeași formă, și atunci distincția se face doar prin interpretarea lor. Spre exemplu, tabelul cu rezultate pentru înmulțirea a două numere de un bit (operație numerică) arată în felul următor:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A * B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
În același timp, operația logică ȘI care întoarce 1 dacă și numai dacă ambii operanzi sunt 1 (mă duc la film DACĂ nu plouă ȘI am bani), are următorul tabel de adevăr:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A ȘI B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Se observă că cele două funcții sunt identice. În acest fel, distincția dintre valoare logică și valoare numerică (respectiv operator logic și operator numeric) ține de interpretarea valorilor de intrare (dacă acestea sunt valori logice sau numerice) iar implementarea operatorilor este identică (prin urmare circuitul asociat este identic).&lt;br /&gt;
&lt;br /&gt;
=== Circuite ===&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Not_gate.png|thumb|Simbol inversor(A - intrare, out - ieșire)]]&lt;br /&gt;
[[Fișier:CMOS_inverter.png|thumb|Inversor alcătuit din tranzistoare CMOS]]&lt;br /&gt;
&lt;br /&gt;
În electronica digitală, ca de fapt în toată ramura tehnologiei care lucrează cu circuite digitale (adică calculatoare) ca și în teroria informației, un element care poate lua o valoare binară asociată unui simbol binar, se numește [http://en.wikipedia.org/wiki/Bit bit]. Baza circuitelor digitale, oricât de complexe, este dată de sub-circuitele care calculează operațiile unare și binare (adică care care au unul respectiv doi operanzi) între doi biți. Un astfel de sub-circuit se numește poartă (en:[http://en.wikipedia.org/wiki/Logic_gate gate]). Aceeași poartă poate fi considerată implementarea unui operator numeric de un bit, dar și implementarea unui operator logic.&lt;br /&gt;
&lt;br /&gt;
Modul de codare a valorilor asociate simbolurilor binare, în electronica digitală, este printr-o diferență de potențial între două puncte. În tehnologia curentă utilizată ([http://en.wikipedia.org/wiki/CMOS CMOS]), o tensiune între 0 și Vdd/2 este asociată valorii binare de 0 iar o tensiune între Vdd/2 și Vdd valorii binare de 1.[http://en.wikipedia.org/wiki/Logic_level]&lt;br /&gt;
&lt;br /&gt;
Cea mai simplă poartă este cea care implementează operația logică de negare (are o singură intrare și o singură ieșire care este intotdeauna diferită de cea de intrare, adică pentru intrarea 0, ieșirea este 1 și pentru intrarea 1, ieșirea este 0). Această poartă se numește inversor, sau poartă NU (en: [http://en.wikipedia.org/wiki/Inverter_(logic_gate) inverter], NOT gate).&lt;br /&gt;
&lt;br /&gt;
Simbolurile și tabelele de adevăr pentru cele mai utilizare porți:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Tip !! Simbol !! Tabel de adevăr !! Tip !! Simbol !! Tabel de adevăr&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;AND&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:and.png|AND symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A AND B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;OR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:or.png|OR symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A OR B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;NOT&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:not.png|NOT symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || NOT A&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0&lt;br /&gt;
|}&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;NAND&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:nand.png|NAND symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A NAND B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 0&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;NOR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:nor.png|NOR symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A NOR B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 0&lt;br /&gt;
|}&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;XOR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:xor.png|XOR symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A XOR B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 0&lt;br /&gt;
|}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;XNOR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| [[Image:xnor.png|XNOR symbol]]&lt;br /&gt;
|&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; align=right&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|colspan=2|&amp;#039;&amp;#039;&amp;#039;INTRARE&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;IEȘIRE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| A || B || A XNOR B&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 0 || 1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|0 || 1 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 0 || 0&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|1 || 1 || 1&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ca și la reprezentarea simbolică a amplificatoarelor operaționale, se observă că nici porțile logice nu au reprezentate porturile de alimentare (Vdd și Vss), vizibile pe schema inversorului CMOS. Acestea se consideră implicit conectate la sursa de alimentare, respectiv la masă.&lt;br /&gt;
&lt;br /&gt;
== Verilog si SystemVerilog HDL ==&lt;br /&gt;
&lt;br /&gt;
La ora actuală, un circuit digital poate ajunge până la 1 miliard de porți. Asta implică faptul că avem nevoie de unelte care să permită automatizarea procesului de design. Acest lucru se poate face folosind limbaje de descriere hardware ([http://en.wikipedia.org/wiki/Hardware_description_language Hardware Description Languages]). Aceste limbaje sunt special concepute pentru a putea descrie un circuit digital, ori din punct de vedere al comportamentului, ori din punct de vedere al structurii. În mod evident, o descriere comportamentală a unui circuit va fi mai succintă, dar nu va oferi informații despre structura dorită (la nivel de poartă), în timp ce o descriere structurală va fi mai exactă din punct de vedere al componentelor circuitului, dar mai lungă și poate mai dificil de înțeles.&lt;br /&gt;
&lt;br /&gt;
Există două limbaje foarte cunoscute de descriere hardware: [http://en.wikipedia.org/wiki/Verilog Verilog] și [http://en.wikipedia.org/wiki/VHDL VHDL]. În continuarea acestui laborator de Circuite Integrate Digitale, vom folosi pentru descriere circuitelor, limbajul Verilog. Sintaxa acestuia este simplă și este parțial moștenită din C. Totuși, este foarte important de reținut că Verilog nu este un limbaj de programare. El nu se „execută” secvențial de către un procesor, ci se sintetizeaza într-un circuit sau se simulează. Prin urmare utilizatorii de Verilog trebuie să se dezobișnuiască să gândească secvențial ca și cum fiecare linie de cod se execută după cea precedentă, si mai degrabă trebuie să-și imagineze cum funcționează circuitul pe care codul respectiv îl descrie. Astfel, diferența cea mai interesantă față de un limbaj de programare, este că ordinea blocurilor de cod dintr-un modul nu contează.&lt;br /&gt;
&lt;br /&gt;
SystemVerilog este o completare la standardul de bază Verilog și aduce multe imbunătățiri în direcția verificării circuitelor, cum ar fi conceptele de programare orientată pe obiecte. Pe langă acestea, apar și câteva imbunătățiri menite să ajute procesul de proiectare, cum ar fi o diferența mai clară și mai usor de urmărit între circuitele combinaționale și secvențiale.&lt;br /&gt;
&lt;br /&gt;
Înainte de a începe lucrul cu uneltele software de simulare și sinteză, parcurgeți tutorial-ul care explică sintaxa [[Verilog]].&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Laboratorul_1&amp;diff=7574</id>
		<title>Laboratorul 1</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Laboratorul_1&amp;diff=7574"/>
		<updated>2023-10-13T05:21:31Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* ALU */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== ALU ===&lt;br /&gt;
Unitatea aritmetico-logică, ALU, este responsabilă de execuţia instrucţiunilor.&lt;br /&gt;
În primul rând, după cum ne şi sugerează numele, instrucţiunile aritmetice şi cele logice, dar şi celelalte categorii de instrucţiuni, în execuţia cărora intervin operaţii precum calculul unor adrese pentru instrucţiunile de acces la memorie sau pentru instrucţiunile de salt relativ.&lt;br /&gt;
Concret, ALU primeşte operanzii unei instrucţiuni şi oferă rezultatul operaţiei specificate în codul instrucţiunii. De exemplu instrucţiunea de adunare determină în ALU adunarea celor doi operanzi de la intrare, suma acestora (rezultatul) apărând la ieşirea ALU. Un alt exemplu, instrucţiunea de salt relativ determină în ALU adunarea a două numere, valoarea contorului de program (PC) şi valoarea saltului relativ specificată în corpul instrucţiunii, rezultatul fiind noua valoare de contor de program, ce va fi încărcată în contorul de program.&lt;br /&gt;
&lt;br /&gt;
Complexitatea ALU este determinată în primul rând de complexitatea operaţiilor aritmetice ale instrucţiunilor din setul de instrucţiuni, însă depinde, uneori semnificativ, şi de performanţele avute în vedere (viteză, paralelism, consum redus) ce pot modifica radical structura aleasă.&lt;br /&gt;
La nivel funcţional, fără a fi preocupaţi de implementarea efectivă, ALU poate fi privit ca un bloc multifuncţional a cărui funcţie este selectată de codul operaţiei instrucţiunii:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
always @(*) begin&lt;br /&gt;
    case(opcode)&lt;br /&gt;
    4&amp;#039;b0001: result = operand1 + operand2;&lt;br /&gt;
    4&amp;#039;b0010: result = operand1 - operand2;&lt;br /&gt;
    // urmeaza implementarea altor operatii&lt;br /&gt;
    endcase&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Descrieți funcțional (comportamental) un ALU de 8 biți ce execută operațiile din tabelul 1.&lt;br /&gt;
&lt;br /&gt;
[[Fișier: asc_lab1_alu.png]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&lt;br /&gt;
|+ Tabelul 1&lt;br /&gt;
! mnemonica !! operație !! opcode !! detalii&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ADD&amp;lt;/code&amp;gt; || adunare  || 4&amp;#039;b0001 ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SUB&amp;lt;/code&amp;gt; || scădere  || 4&amp;#039;b0010 || operandul 2 se scade din operandul 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AND&amp;lt;/code&amp;gt; || ȘI logic || 4&amp;#039;b0011 || fiecare bit al rezultatului este ȘI logic între biții corespunzători ai operanzilor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;OR&amp;lt;/code&amp;gt; || SAU logic || 4&amp;#039;b0100 || fiecare bit al rezultatului este SAU logic între biții corespunzători ai operanzilor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;XOR&amp;lt;/code&amp;gt; || XOR logic || 4&amp;#039;b0101 || fiecare bit al rezultatului este SAU-EXCLUSIV logic între biții corespunzători ai operanzilor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CMP&amp;lt;/code&amp;gt; || comparație  ||  4&amp;#039;b0111 || Z și N se modifică conform tabelului 2&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt; || transfer ||  4&amp;#039;b1001 || operandul2 este transferat la ieșirea ALU&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;code&amp;gt;STORE&amp;lt;/code&amp;gt; || transfer ||  4&amp;#039;b1010 || operandul2 este transferat la ieșirea ALU&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Tabelul 1 nu conține toate instrucțiunile setului de instrucțiuni, ci numai instrucțiunile care folosesc ALU. Pentru instrucțiunile ce nu folosesc ALU implementarea execuției lor în ALU poate fi ignorată, dar rezultatul de la ieșirea ALU nu trebuie scris în vreun registru.&lt;br /&gt;
&lt;br /&gt;
Rezultatul operației de comparație este semnalizat prin biții indicatori ai rezultatului:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center;&lt;br /&gt;
|+ Tabelul 2&lt;br /&gt;
! !! Z !! N&lt;br /&gt;
|-&lt;br /&gt;
| operand1 &amp;gt; operand2 || 0  || 0&lt;br /&gt;
|-&lt;br /&gt;
| operand1 = operand2 || 1  || 0&lt;br /&gt;
|-&lt;br /&gt;
| operand1 &amp;lt; operand2 || 0 || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Biții indicatori sunt calculați pentru fiecare operație și reflectă starea rezultatului. Procesorul implementat în laborator are doi indicatori, &amp;#039;&amp;#039;&amp;#039;Z&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;#039;. Dacă rezultatul este zero se activează bitul &amp;#039;&amp;#039;&amp;#039;Z&amp;#039;&amp;#039;&amp;#039; (zero). Dacă rezultatul este negativ se activează ieșirea &amp;#039;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;#039; (negativ). Operația de comparație poate fi implementată ca o operație de scădere fără destinație (se salvează în procesor doar biții indicatori nu și rezultatul):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
assign Z = (result == 0);&lt;br /&gt;
assign N = result[7]; // în complement față de 2 bitul MSB este bit de semn&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== REGS ===&lt;br /&gt;
&lt;br /&gt;
Setul de registre are 16 registre de 8 biți. Fiecare registru poate fi sursa oricărui operand și poate fi destinație.&lt;br /&gt;
Setul de registre poate avea porturi distincte pentru scriere și pentru citire, precum și porturi separate pentru fiecare operand citit.&lt;br /&gt;
Implementarea aleasă pentru acest laborator are un set de registre cu trei porturi, un port pentru citirea primului operand (&amp;#039;&amp;#039;&amp;#039;raddr1&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;rdata1&amp;#039;&amp;#039;&amp;#039;), altul pentru citirea celui de al doilea operand (&amp;#039;&amp;#039;&amp;#039;raddr2&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;rdata2&amp;#039;&amp;#039;&amp;#039;) și un port pentru scriere (&amp;#039;&amp;#039;&amp;#039;waddr&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;wdata&amp;#039;&amp;#039;&amp;#039;). Portul de scriere folosește un semnal de control, &amp;#039;&amp;#039;&amp;#039;wen&amp;#039;&amp;#039;&amp;#039;, ce activează scrierea numai pentru anumite instrucțiuni. Pentru accesul la un registru este nevoie de o adresă de 4 biți. Semnalele de adresă &amp;#039;&amp;#039;&amp;#039;raddr1&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;raddr2&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;waddr&amp;#039;&amp;#039;&amp;#039; sunt de 4 biți. Datele sunt pe 8 biți, prin urmare registrele, ieșirile de date &amp;#039;&amp;#039;&amp;#039;rdata1&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;rdata2&amp;#039;&amp;#039;&amp;#039;, dar și intrarea de date &amp;#039;&amp;#039;&amp;#039;wdata&amp;#039;&amp;#039;&amp;#039; sunt fiecare de câte 8 biți.&lt;br /&gt;
&lt;br /&gt;
[[Fișier: asc_lab1_regs.png]]&lt;br /&gt;
&lt;br /&gt;
Scrierea în setul de registre este secvențială, pe frontul semnalului de ceas de la intrarea &amp;#039;&amp;#039;&amp;#039;clk&amp;#039;&amp;#039;&amp;#039; (nereprezentată în figura de mai sus).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
reg [7:0] registru [0:15]; // set de 16 registre a câte 8 biți fiecare&lt;br /&gt;
&lt;br /&gt;
// portul de scriere&lt;br /&gt;
always @(posedge clk) begin&lt;br /&gt;
    if(wen) registru[waddr] &amp;lt;= wdata; // scriere sincronă - pe ceas - a valorii de la intrarea de date wdata în registrul destinație&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
// portul 1 de citire&lt;br /&gt;
assign rdata1 = registru[raddr1]; // ieșirea rdata1 este valoarea din registrul cu numărul raddr1&lt;br /&gt;
// portul 2 de citire&lt;br /&gt;
                                  // &amp;lt;- completați codul&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== RALU ===&lt;br /&gt;
&lt;br /&gt;
Unitatea aritmetico-logică împreună cu setul de registre formează RALU (Register and ALU).&lt;br /&gt;
&lt;br /&gt;
[[Fișier: asc_lab1_ralu.png]]&lt;br /&gt;
&lt;br /&gt;
=== validare RALU ===&lt;br /&gt;
&lt;br /&gt;
Scrieti un modul de testare ce instanțiază setul de registre și ALU, generează ceasul, semnalul de reset și o secvență de instrucțiuni.&lt;br /&gt;
&lt;br /&gt;
==== generarea ceasului ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
initial begin&lt;br /&gt;
    clk = 0;                 // initialization at time 0&lt;br /&gt;
    forever #10 clk = ~clk;  // toggle the clock at each 10 simulation steps&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== generarea semnalului de reset ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
initial begin&lt;br /&gt;
    rst = 0;&lt;br /&gt;
    #13 rst = 1; // reset activ în 1 logic&lt;br /&gt;
    #20 rst = 0;&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Întîrzierile sunt alese astfel încât fronturile semnalului de reset să nu coincidă cu fronturile ceasului.&lt;br /&gt;
&lt;br /&gt;
==== generarea secvenței de instrucțiuni ====&lt;br /&gt;
&lt;br /&gt;
La fiecare ceas se setează valorile intrărilor &amp;#039;&amp;#039;&amp;#039;opcode&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;sursa1&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;sursa2&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;dest&amp;#039;&amp;#039;&amp;#039; și &amp;#039;&amp;#039;&amp;#039;wen&amp;#039;&amp;#039;&amp;#039; cu valori care să corespundă instrucțiunii dorite.&lt;br /&gt;
Pentru a ne asigura că toate semnalele se modifică numai după frontul activ al ceasului, vom aștepta de fiecare dată acest front folosind instrucțiunea &amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot; inline&amp;gt;@(posedge clk);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Semnalul &amp;#039;&amp;#039;&amp;#039;wen&amp;#039;&amp;#039;&amp;#039; se setează la &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039; sau la &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039; după cum dorim ca &amp;#039;&amp;#039;&amp;#039;wdata&amp;#039;&amp;#039;&amp;#039; să se salveze sau nu în registrul destinație.&lt;br /&gt;
Semnalul &amp;#039;&amp;#039;&amp;#039;wen&amp;#039;&amp;#039;&amp;#039; nu face parte din instrucțiune. În laboratorul 2 el va fi generat de unitatea de control a procesorului (UCP) în funcție de codul instrucțiunii. De exemplu instrucțiunea CMP nu modifică niciun registru ci doar biții indicatori, prin urmare &amp;#039;&amp;#039;&amp;#039;wen&amp;#039;&amp;#039;&amp;#039; va fi în permanență &amp;#039;&amp;#039;&amp;#039;0&amp;#039;&amp;#039;&amp;#039; pe durata procesării acestei instrucțiuni.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
initial begin&lt;br /&gt;
    opcode = 4&amp;#039;b0000; dest = 4&amp;#039;d0; sursa1 = 4&amp;#039;d0; sursa2 = 4&amp;#039;d0; wen = 1&amp;#039;b0;&lt;br /&gt;
    #26 // se așteaptă finalizarea resetului&lt;br /&gt;
    @(posedge clk);&lt;br /&gt;
    opcode = 4&amp;#039;b0001; dest = 4&amp;#039;d7; sursa1 = 4&amp;#039;d6; sursa2 = 4&amp;#039;d5; wen = 1&amp;#039;b1; // ADD R7 R6 R5 // R7 &amp;lt;- R6 + R5&lt;br /&gt;
    @(posedge clk);&lt;br /&gt;
    opcode = 4&amp;#039;b0010; dest = 4&amp;#039;d7; sursa1 = 4&amp;#039;d7; sursa2 = 4&amp;#039;d4; wen = 1&amp;#039;b1; // SUB R7 R7 R4 // R7 &amp;lt;- R7 - R4&lt;br /&gt;
    // alte instrucțiuni&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== initializarea valorilor in registre ===&lt;br /&gt;
&lt;br /&gt;
Se poate face a) la reset, dacă modulul are intrare de reset, sau b)  într-un bloc &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; folosit doar pentru simulare.&lt;br /&gt;
&lt;br /&gt;
a)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
always @(posedge clk) begin&lt;br /&gt;
    if(rst) begin&lt;br /&gt;
        registru[0] = 13;&lt;br /&gt;
        . . . &lt;br /&gt;
    end&lt;br /&gt;
    else begin&lt;br /&gt;
        if(wen) . . .&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
b)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
initial begin&lt;br /&gt;
    registru[0] = 13;&lt;br /&gt;
    registru[1] = 27;&lt;br /&gt;
    . . . .&lt;br /&gt;
end&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dacă blocul &amp;#039;&amp;#039;&amp;#039;initial&amp;#039;&amp;#039;&amp;#039; este scris în modulul de testare iar variabilele inițializate sunt din interiorul modului testat sau chiar dintr-un submodul al acestuia, numele acestora trebuie să fie complet, corespunzător ierarhiei.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
    ralu.regs.registru[0] = 13;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_9_:_Numaratorul&amp;diff=7526</id>
		<title>CID aplicatii 9 : Numaratorul</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_9_:_Numaratorul&amp;diff=7526"/>
		<updated>2023-05-04T06:45:11Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Exemplul 2: Observarea vitezei de variație a biților unui numărător */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Numărătorul ==&lt;br /&gt;
Numărătorul este cel mai simplu automat, fiind format dintr-un registru (element de memorare) ce reține valoarea curentă a acestuia și un circuit de incrementare (circuit de reacție) ce generează la ieșirea sa valoarea ce va trebui stocată în registru la următorul front crescător de ceas (valoarea curentă incrementată cu 1). &lt;br /&gt;
&lt;br /&gt;
În figura de mai jos este reprezentat un numărător cu reset sincron:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Numarator cu reset.png|600px]]&lt;br /&gt;
&lt;br /&gt;
În cazul de mai sus, cât timp semnalul &amp;#039;&amp;#039;reset&amp;#039;&amp;#039; este activ, valoarea numărătorului va fi 0. Atunci când semnalul &amp;#039;&amp;#039;reset&amp;#039;&amp;#039; nu este activ, numărătorul își va incrementa valoarea la fiecare front crescător de ceas.&lt;br /&gt;
&lt;br /&gt;
== Divizor de frecvență cu factor de divizare putere a lui 2==&lt;br /&gt;
În unele cazuri, apare necesitatea obținerii unor semnale de ceas cu frecvență mai mică decât cea a ceasului de sistem. Aceste noi semnale de ceas pot fi obținute chiar din semnalul de ceas al sistemului, prin circuite care realizează divizarea acestuia. Cea mai simplă divizare a unui semnal de ceas este cea cu factor de divizare egal cu o putere a lui 2. Pentru acest caz, putem folosi un numărător.&lt;br /&gt;
&lt;br /&gt;
Dacă urmărim figura de mai jos în care sunt reprezentate variațiile fiecărui bit în timpul funcționării unui numărător pe 4 biți, observăm că, cu cât ordinul bitului crește (este mai semnificativ), frecvența de variație este mai mică. Între frecvențele de variație corespunzătoare a doi biți succesivi există următoarea relație: frecvența unui bit este de două ori mai mică decât frecvența bitului anterior (mai puțin semnificativ).&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Divizare frecventa.png]]&lt;br /&gt;
&lt;br /&gt;
Observând că frecvența bitului 0 este de două ori mai mică decât cea a ceasului, putem concluziona că frecvența de variație a bitului cu indicele N este dată de: &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;f&amp;lt;sub&amp;gt;bN&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039; = &amp;#039;&amp;#039;f&amp;lt;sub&amp;gt;clk&amp;lt;/sub&amp;gt; / 2&amp;lt;sup&amp;gt;N+1&amp;lt;/sup&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Așadar, pentru a realiza un divizor de frecvență cu factor de divizare putere a lui 2, putem folosi un numărător îndeajuns de mare, din care extragem bitul cu frecvența de variație egală cu frecvența dorită.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Exemple==&lt;br /&gt;
===Exemplul 1: Implementarea unui numărător cu reset sincron===&lt;br /&gt;
În acest exemplu vom realiza implementarea numărătorului cu reset sincron prezentat în figura din secțiunea de introducere teoretică. În plus, vom folosi parametrul WIDTH pentru a controla dimensiunea acestuia.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Numărătorului cu reset sincron&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Numarator&lt;br /&gt;
#(parameter WIDTH = 8)&lt;br /&gt;
(&lt;br /&gt;
    input clock,&lt;br /&gt;
    input reset_n,&lt;br /&gt;
    output reg [WIDTH-1:0] count  &lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always@(posedge clock) begin&lt;br /&gt;
    if(reset_n == 0)&lt;br /&gt;
        count &amp;lt;= 0;&lt;br /&gt;
    else&lt;br /&gt;
        count &amp;lt;= count + 1;  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea unui modul de test pentru numărător&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module Numarator_TB();&lt;br /&gt;
&lt;br /&gt;
parameter WIDTH_T = 5;&lt;br /&gt;
reg reset_n_t, clock_t;&lt;br /&gt;
wire [WIDTH_T-1:0] count_t;&lt;br /&gt;
	&lt;br /&gt;
initial begin&lt;br /&gt;
    clock_t = 0;&lt;br /&gt;
    forever #1 clock_t = ~clock_t;&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
initial begin&lt;br /&gt;
        reset_n_t = 0;&lt;br /&gt;
    #2 	reset_n_t = 1;&lt;br /&gt;
    #500 $stop();	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Numarator #(.WIDTH(WIDTH_T)) DUT(&lt;br /&gt;
    .clock(clock_t),&lt;br /&gt;
    .reset_n(reset_n_t),&lt;br /&gt;
    .count(count_t)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; Cât timp semnalul &amp;#039;&amp;#039;reset&amp;#039;&amp;#039; este inactiv, numărătorul își va incrementa valoarea la fiecare front crescător de ceas. Când va ajunge la valoarea sa maximă (de exemplu, 31 pentru un numărător pe 5 biți), va avea loc o depășire și având la dispozitie un număr limitat de biți (de exemplu, 5), semnalul de ieșire va deveni 0 (reținem doar cei mai puțin semnificativi 5 biți), circuitul reluând numărarea de la capat.&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2: Observarea vitezei de variație a biților unui numărător===&lt;br /&gt;
În acest exemplu vom realiza implementarea unui divizor de frecvență ce generează la ieșire 4 semnale de ceas cu următoarele frecvențe:&lt;br /&gt;
* &amp;#039;&amp;#039;clkout1&amp;#039;&amp;#039;: semnal de ceas cu frecvența de 1 Hz.&lt;br /&gt;
* &amp;#039;&amp;#039;clkout2&amp;#039;&amp;#039;: semnal de ceas cu frecvența de 2 Hz.&lt;br /&gt;
* &amp;#039;&amp;#039;clkout4&amp;#039;&amp;#039;: semnal de ceas cu frecvența de 4 Hz.&lt;br /&gt;
* &amp;#039;&amp;#039;clkout8&amp;#039;&amp;#039;: semnal de ceas cu frecvența de 8 Hz.&lt;br /&gt;
&lt;br /&gt;
Dacă aplicăm formula &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;f&amp;lt;sub&amp;gt;bN&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039; = &amp;#039;&amp;#039;f&amp;lt;sub&amp;gt;clk&amp;lt;/sub&amp;gt; / 2&amp;lt;sup&amp;gt;N+1&amp;lt;/sup&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; cunoscând că frecvența de ceas a FPGA-ului este de 100 MHz, vom obține:&lt;br /&gt;
* &amp;#039;&amp;#039;clkout1&amp;#039;&amp;#039; poate fi obținut prin bitul 26 al unui numărător.&lt;br /&gt;
* &amp;#039;&amp;#039;clkout2&amp;#039;&amp;#039; poate fi obținut prin bitul 25 al unui numărător.&lt;br /&gt;
* &amp;#039;&amp;#039;clkout4&amp;#039;&amp;#039; poate fi obținut prin bitul 24 al unui numărător.&lt;br /&gt;
* &amp;#039;&amp;#039;clkout8&amp;#039;&amp;#039; poate fi obținut prin bitul 23 al unui numărător.&lt;br /&gt;
&lt;br /&gt;
Din rezultatele de mai sus, rezultă că avem nevoie de un numărător pe 27 biți, astfel încât să putem folosi bitul cel mai semnificativ (bitul 26) pentru generarea semnalului de ceas cu frecvența cea mai mică.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module clock_generator(&lt;br /&gt;
    input clock,&lt;br /&gt;
    input reset,&lt;br /&gt;
    output clkout1,&lt;br /&gt;
    output clkout2,&lt;br /&gt;
    output clkout4,&lt;br /&gt;
    output clkout8,&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
reg [26:0] count;&lt;br /&gt;
&lt;br /&gt;
always@(posedge clock) begin&lt;br /&gt;
    if(reset == 1)&lt;br /&gt;
        count &amp;lt;= 0;&lt;br /&gt;
    else&lt;br /&gt;
        count &amp;lt;= count + 1;  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
assign clkout1 = count[26];&lt;br /&gt;
assign clkout2 = count[25];&lt;br /&gt;
assign clkout4 = count[24];&lt;br /&gt;
assign clkout8 = count[23];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; Cerința ca reset să fie activ în 1 este impusă de logica în care lucrează butoanele FPGA-ului.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea circuitului pe FPGA&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Realizați sinteza circuitului pe FPGA, ținând cont de următoarele constrângeri de I/O:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Port&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Conexiune&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| clock || CLK_100MHz&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| reset || Button 0 &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| clkout1 || LED3&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| clkout2  || LED2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| clkout4  || LED1 &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| clkout8  || LED0 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Observați viteza cu care fiecare din LED-uri se stinge și se aprinde.&lt;br /&gt;
&lt;br /&gt;
== Exerciții==&lt;br /&gt;
===Exercițiul 1===&lt;br /&gt;
Implementați un numărător parametrizat cu reset sincron și semnal de &amp;#039;&amp;#039;enable&amp;#039;&amp;#039;. Semnalul &amp;#039;&amp;#039;enable&amp;#039;&amp;#039; controlează funcționarea numărătorului astfel: când este activ (egal cu 1), permite funcționarea normală (incrementare la fiecare front crescător de ceas); când este inactiv (egal cu 0), va determina numărătorul să își păstreze valoarea curentă.&lt;br /&gt;
&lt;br /&gt;
Implementați și un modul de test care să testeze funcționarea corectă a circuitului.&lt;br /&gt;
&lt;br /&gt;
===Exercițiul 2===&lt;br /&gt;
Implementați un numărător parametrizat cu reset sincron și capacitatea de a număra crescător sau descrescător. Controlul direcției de numărare se va realiza cu ajutorul unui semnal &amp;#039;&amp;#039;count_updown&amp;#039;&amp;#039;, care controlează funcționarea numărătorului astfel: când este 0, numărătorul va număra crescător, prin incrementarea valorii curente, iar când este 1, numărătorul va număra descrescător, prin decrementarea valorii curente&lt;br /&gt;
&lt;br /&gt;
Implementați și un modul de test care să testeze funcționarea corectă a circuitului.&lt;br /&gt;
&lt;br /&gt;
===Exercițiul 3===&lt;br /&gt;
Implementați circuitul descris prin schema de mai jos, știind că:&lt;br /&gt;
* COUNTER este un numărător pe 32 biți fără reset.&lt;br /&gt;
* RAM este o memorie 16x4b, cu citire sincrona.&lt;br /&gt;
* ROM este o memorie 16x4b, ce are descrierea prezentată mai jos.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Cid_lab6.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea modulului ROM&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module ROM(&lt;br /&gt;
    input [3:0] in,&lt;br /&gt;
    output reg [3:0] out&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always @(in)&lt;br /&gt;
    case(in)&lt;br /&gt;
        0: out = 4&amp;#039;b0000;&lt;br /&gt;
        1: out = 4&amp;#039;b0110;&lt;br /&gt;
        2: out = 4&amp;#039;b0011;&lt;br /&gt;
        3: out = 4&amp;#039;b1110;&lt;br /&gt;
        4: out = 4&amp;#039;b1011;&lt;br /&gt;
        5: out = 4&amp;#039;b1111;&lt;br /&gt;
        6: out = 4&amp;#039;b0111;&lt;br /&gt;
        7: out = 4&amp;#039;b1100;&lt;br /&gt;
        8: out = 4&amp;#039;b0001;&lt;br /&gt;
        9: out = 4&amp;#039;b0101;&lt;br /&gt;
        10: out = 4&amp;#039;b1101;&lt;br /&gt;
        11: out = 4&amp;#039;b1010;&lt;br /&gt;
        12: out = 4&amp;#039;b0010;&lt;br /&gt;
        13: out = 4&amp;#039;b0100;&lt;br /&gt;
        14: out = 4&amp;#039;b1000;&lt;br /&gt;
        15: out = 4&amp;#039;b1001;&lt;br /&gt;
        default: out = 4&amp;#039;b0000;&lt;br /&gt;
    endcase&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Realizați un modul de test în care să scrieți memoria RAM cu date, astfel încât să se realizeze citirea memoriei ROM în ordine, la fiecare ciclu de ceas (adresa 0 -&amp;gt; adresa 1 -&amp;gt; ... -&amp;gt; adresa 15 -&amp;gt; adresa 0 -&amp;gt; ...)&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Tutorial_Vivado&amp;diff=7513</id>
		<title>Tutorial Vivado</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Tutorial_Vivado&amp;diff=7513"/>
		<updated>2023-03-16T07:05:21Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Sinteza și implementarea unui circuit digital pe FPGA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalare Vivado ==&lt;br /&gt;
Pentru a instala utilitarul Vivado, acesta trebuie descarcat de pe site-ul [https://www.xilinx.com/support/download.html Xilinx], alegand versiunea potrivita sistemului de operare folosit. Pentru a putea descarca orice utilitar Xilinx, va trebui mai intai sa creati un cont. Pentru instalarea Vivado 2020.2 pe sistemul de operare Windows, puteti consulta pagina [[Tutorial instalare Vivado]].&lt;br /&gt;
&lt;br /&gt;
== Utilizarea Vivado pentru simularea si sinteza circuitelor digitale ==&lt;br /&gt;
=== Crearea unui proiect ===&lt;br /&gt;
Pentru a crea un proiect nou, mergeti la &amp;#039;&amp;#039;&amp;#039;File-&amp;gt;Project-&amp;gt;New&amp;#039;&amp;#039;&amp;#039;, iar apoi vom urma pasii de configurare:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 1: Denumirea proiectului si stabilirea caii catre acesta&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
La acest pas vom denumi proiectul (de obicei, numele trebuie sa corespunda cu numele modulului TOP) si vom stabili calea la care se va crea acesta.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas1.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 2: Alegerea tipului proiectului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
La acest pas, vom selecta RTL Project, apoi vom da click pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 2.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 3: Adaugarea surselor deja existente&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
La acest pas vom adauga proiectului sursele modulelor pentru care avem deja descrierea in fisiere de tip Verilog. Acest lucru se face prin &amp;#039;&amp;#039;&amp;#039;Add Files&amp;#039;&amp;#039;&amp;#039; si selectarea acestora. Daca nu avem fisiere de adaugat, putem da click direct pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 3.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 4: Adaugarea fisierelor de constrangeri&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
La acest pas vom adauga fisierele de constrangeri pentru sinteza si implemenatrea pe FPGA, daca este cazul. Daca nu, putem da direct click pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 4.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 5: Alegerea dispozitivului tinta&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Se selecteaza din meniul &amp;#039;&amp;#039;&amp;#039;Parts&amp;#039;&amp;#039;&amp;#039; dispozitivul &amp;#039;&amp;#039;&amp;#039;xc7s50csga324-1&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Tutorial Vivado selectare dispozitiv.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- La acest pas vom alege dispozitivul tinta. In cazul laboratorului nostru, acesta este placuta &amp;#039;&amp;#039;&amp;#039;PYNQ Z2&amp;#039;&amp;#039;&amp;#039;. Mergem la tab-ul &amp;#039;&amp;#039;&amp;#039;Boards&amp;#039;&amp;#039;&amp;#039;, alegem PYNQ Z2, iar apoi dam click pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 5.png|600px]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dupa alegerea dispozitivului, va aparea o pagina cu rezumatul setarilor proiectului. Daca totul este corect, dam click pe &amp;#039;&amp;#039;&amp;#039;Finish&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 6: Pagina principala a proiectului&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 6.png]]&lt;br /&gt;
&lt;br /&gt;
In fereastra principala a proiectului se pot observa urmatoarele zone: &amp;#039;&amp;#039;&amp;#039;Flow navigator&amp;#039;&amp;#039;&amp;#039;, in care avem principalele comenzi utilizate in crearea, simularea, sinteza si implementarea unui circuit digital pe FPGA, &amp;#039;&amp;#039;&amp;#039;Sources&amp;#039;&amp;#039;&amp;#039;, in care vedem lista cu sursele proiectului (fisiere verilog in care descriem modulele, fisiere utilizate in simulare, in care vom descrie modulele de test, fisierele de constrangeri), &amp;#039;&amp;#039;&amp;#039;Consola&amp;#039;&amp;#039;&amp;#039;, in josul paginii si zona &amp;#039;&amp;#039;&amp;#039;Project Sumary&amp;#039;&amp;#039;&amp;#039;, in care se vor deschide fisierele proiectului.&lt;br /&gt;
&lt;br /&gt;
=== Adaugarea sau crearea de fisiere===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 1:&amp;#039;&amp;#039;&amp;#039; In zona &amp;#039;&amp;#039;&amp;#039;Sources&amp;#039;&amp;#039;&amp;#039;, dam click pe &amp;#039;&amp;#039;&amp;#039;+&amp;#039;&amp;#039;&amp;#039;, iar apoi apare pe ecran fereastra in care trebuie sa selectam tipul fisierului: Vom alege &amp;#039;&amp;#039;&amp;#039;Add or create constains&amp;#039;&amp;#039;&amp;#039;, daca dorim crearea sau adaugarea unui fisier de constrangeri, &amp;#039;&amp;#039;&amp;#039;Add or create design sources&amp;#039;&amp;#039;&amp;#039;, in cazul in care dorim crearea sau sa adaugarea de fisiere in care vom descrie modulele digitale, sau &amp;#039;&amp;#039;&amp;#039;Add or create simulation sources&amp;#039;&amp;#039;&amp;#039;, in cazul in care dorim adaugarea sau crearea de fisiere ce vor fi utlizate pentru simulare.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 7.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 2:&amp;#039;&amp;#039;&amp;#039; Daca dorim adaugarea unor fisiere existente, dam click pe &amp;#039;&amp;#039;&amp;#039;Add File&amp;#039;&amp;#039;&amp;#039; si navigam pana la locul in care se afla aceste fisere. Daca dorim crearea unui nou fisier, dam click pe &amp;#039;&amp;#039;&amp;#039;Create File&amp;#039;&amp;#039;&amp;#039;. Se va deschide o frestra mica in care vom completa numele fisierului (de obicei, acesta corespunde cu numele modului descris in interiorul sau) si vom selecta limbajul pe care il vom folosi (Verilog). Dam click pe &amp;#039;&amp;#039;&amp;#039;OK&amp;#039;&amp;#039;&amp;#039;, iar apoi pe &amp;#039;&amp;#039;&amp;#039;Finish&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 8.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 3:&amp;#039;&amp;#039;&amp;#039; Vom completa in urmatoarea fereastra numele modulului descris. Obtional, putem completa si lista porturile impreuna cu tipul si dimensiunea lor, Vivado creand astfel pentru noi scheletele descrierii. &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 9.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 4:&amp;#039;&amp;#039;&amp;#039; Fisierul creat va aparea in &amp;#039;&amp;#039;&amp;#039;Sources&amp;#039;&amp;#039;&amp;#039;. Pentru a-l deschide, vom da doublu-click pe acesta, deschizandu-se in zona &amp;#039;&amp;#039;&amp;#039;Project Summary&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 10.png|780px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Simularea unui circuit digital ===&lt;br /&gt;
Pentru a putea simula un circuit digital, avem nevoie de cel putin doua fisiere: un fisier ce contine descrierea circuitului si un fisier ce contine descrierea modulului de test (test bench). Dupa crearea celor doua module, pentru a rula simularea vom urma pasii urmatori:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 1:&amp;#039;&amp;#039;&amp;#039; In zona &amp;#039;&amp;#039;&amp;#039;Flow navigator&amp;#039;&amp;#039;&amp;#039; dam click pe &amp;#039;&amp;#039;&amp;#039;Run Simulation&amp;#039;&amp;#039;&amp;#039;, iar apoi click pe &amp;#039;&amp;#039;&amp;#039;Run Behavioral Simulation&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 11.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 2:&amp;#039;&amp;#039;&amp;#039; Dupa rularea simularii vom observa pe ecran trei zone principale: &amp;#039;&amp;#039;&amp;#039;Scope&amp;#039;&amp;#039;&amp;#039;, in care vedem modulul si submodulele simulate, &amp;#039;&amp;#039;&amp;#039;Objects&amp;#039;&amp;#039;&amp;#039;, in care vom vedea semnalele din interiorul fiecarui modul/submodul si &amp;#039;&amp;#039;&amp;#039;Wave&amp;#039;&amp;#039;&amp;#039;, in care vom vedea forma de unda obtinuta in urma simularii.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 12.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 3:&amp;#039;&amp;#039;&amp;#039; Putem adauga semnale la forma de unda selectand semnalul dorit din fereastra &amp;#039;&amp;#039;&amp;#039;Objects&amp;#039;&amp;#039;&amp;#039;, dand click dreapta si &amp;#039;&amp;#039;&amp;#039;Add to Wave Window&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 13.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 4:&amp;#039;&amp;#039;&amp;#039; Pentru a observa evolutia in timp a semnalelor nou adaugate, simularea trebuie repornita. Pentru acesta, dam click pe &amp;#039;&amp;#039;&amp;#039;Restart&amp;#039;&amp;#039;&amp;#039;, apoi pe &amp;#039;&amp;#039;&amp;#039;Run All&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 14.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 5:&amp;#039;&amp;#039;&amp;#039; Folosind Zoom In / Zoom Out, stabilim un nivel optim de zoom, astfel incat sa vizualizarea formelor de unda sa fie semnificativa.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 15.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Setarile initiale ale Vivado opresc simularea dupa 1000ns. Daca se doreste o simulare mai lunga si pentru a nu fi nevoie sa se apese run dupa cele 1000ns initiale, se poate introduce &amp;quot;-all&amp;quot; in Settings-&amp;gt;Simulation-&amp;gt;Simulation-&amp;gt;xsim.simulate.runtime.&lt;br /&gt;
&lt;br /&gt;
=== Sinteza și implementarea unui circuit digital pe FPGA ===&lt;br /&gt;
După ce am descris modulul și ne-am asigurat că nu există erori de sintaxă sau chiar erori funcșionale prin simulare, putem merge mai departe la sinteza și implementarea acestuia pe FPGA.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 1: Elaborarea circuitului&amp;#039;&amp;#039;&amp;#039;: La acest pas, utilitarul interpretează codul Verilog, identificând componentele și modul în care ele sunt conectate, generând &amp;#039;&amp;#039;&amp;#039;netlist&amp;#039;&amp;#039;&amp;#039;-ul. Această etapă este independentă de tehnologie.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul1.png|800px]]&lt;br /&gt;
&lt;br /&gt;
După elaborare, putem vizualiza schema circutului din secțiunea &amp;#039;&amp;#039;&amp;#039;Flow Navigator -&amp;gt; RTL ANALYSIS -&amp;gt; Open Elaborated Design -&amp;gt; Schematic&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul1 1.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 2:&amp;#039;&amp;#039;&amp;#039; Vom deschide planificatorul de pini din &amp;#039;&amp;#039;&amp;#039;Layout -&amp;gt; I/O planning&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 3: Asocierea pinilor plăcii cu porturile circuitului&amp;#039;&amp;#039;&amp;#039; La acest pas vom asocia porturile circuitului descris cu [[Boolean Board - Pinout|pinii plăcii FPGA]]. În plus, vom selecta pentru toți pinii standardul &amp;#039;&amp;#039;&amp;#039;LVCMOS33&amp;#039;&amp;#039;&amp;#039; (coloana &amp;#039;&amp;#039;&amp;#039;I/O Std&amp;#039;&amp;#039;&amp;#039;). Aceasta este o caracteristică hardware și poate diferi de la un dispozitiv la altul.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul3.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 4: Sinteza circuitului&amp;#039;&amp;#039;&amp;#039; La acest pas se realizează transformarea circuitului descris într-un netlist dependent de tehnologie. Se vor folosi la acest pas primitivele disponibile pe FPGA. În plus, deoarece am introdus în I/O Planning constrângerile legate de legarea porturilor la pinii plăcii, tot aici va fi integrată și această informație.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul4.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 5: Implementarea circuitului&amp;#039;&amp;#039;&amp;#039; La acest pas se preia netlist-ul ce conține primitivele FPGA și modul lor de interconectare realizat la pasul anterior și se realizează maparea lor efectivă în FPGA (place and route).&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul5.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 6:&amp;#039;&amp;#039;&amp;#039; După implementare, putem deschide circuitul elaborat pentru a studia căteva elemente precum schema circuitului sintetizat sau diverse rapoarte de sinteză.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul6.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Schema circuitului cu componente disponibile pe FPGA.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul6 1.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Fișierul de constrângeri generat. Acesta putea fi adăugat la proiect și scris manual, dacă nu doream să utilizîm I/O Planning.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul6 2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 7: Generare a fișierului de programare&amp;#039;&amp;#039;&amp;#039; Din circuitul de la punctul anterior, se generează un fișier cu extensia .bit care conține biții de configurare pentru blocurile logice, blocurile de I/O și blocurile de interconectare corespunzătoare circuitului.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul7.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 8: Conectarea la placa FPGA&amp;#039;&amp;#039;&amp;#039; Se deschide managerul hardware și ne conectăm la placa FPGA prin Auto Connect. Aceeași operațiunea poate fi realizată și din &amp;#039;&amp;#039;&amp;#039;Flow Navigator -&amp;gt; PROGRAM AND DEBUG -&amp;gt; Open Hardware Manager -&amp;gt; Open Target -&amp;gt; Auto Connect&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul8.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 9: Programarea plăcii&amp;#039;&amp;#039;&amp;#039; La acest pas se descarcă fișierul de configurare pe placă.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul9.png|800px]]&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Tutorial_Vivado&amp;diff=7512</id>
		<title>Tutorial Vivado</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Tutorial_Vivado&amp;diff=7512"/>
		<updated>2023-03-16T07:03:01Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Crearea unui proiect */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalare Vivado ==&lt;br /&gt;
Pentru a instala utilitarul Vivado, acesta trebuie descarcat de pe site-ul [https://www.xilinx.com/support/download.html Xilinx], alegand versiunea potrivita sistemului de operare folosit. Pentru a putea descarca orice utilitar Xilinx, va trebui mai intai sa creati un cont. Pentru instalarea Vivado 2020.2 pe sistemul de operare Windows, puteti consulta pagina [[Tutorial instalare Vivado]].&lt;br /&gt;
&lt;br /&gt;
== Utilizarea Vivado pentru simularea si sinteza circuitelor digitale ==&lt;br /&gt;
=== Crearea unui proiect ===&lt;br /&gt;
Pentru a crea un proiect nou, mergeti la &amp;#039;&amp;#039;&amp;#039;File-&amp;gt;Project-&amp;gt;New&amp;#039;&amp;#039;&amp;#039;, iar apoi vom urma pasii de configurare:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 1: Denumirea proiectului si stabilirea caii catre acesta&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
La acest pas vom denumi proiectul (de obicei, numele trebuie sa corespunda cu numele modulului TOP) si vom stabili calea la care se va crea acesta.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas1.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 2: Alegerea tipului proiectului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
La acest pas, vom selecta RTL Project, apoi vom da click pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 2.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 3: Adaugarea surselor deja existente&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
La acest pas vom adauga proiectului sursele modulelor pentru care avem deja descrierea in fisiere de tip Verilog. Acest lucru se face prin &amp;#039;&amp;#039;&amp;#039;Add Files&amp;#039;&amp;#039;&amp;#039; si selectarea acestora. Daca nu avem fisiere de adaugat, putem da click direct pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 3.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 4: Adaugarea fisierelor de constrangeri&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
La acest pas vom adauga fisierele de constrangeri pentru sinteza si implemenatrea pe FPGA, daca este cazul. Daca nu, putem da direct click pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 4.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 5: Alegerea dispozitivului tinta&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Se selecteaza din meniul &amp;#039;&amp;#039;&amp;#039;Parts&amp;#039;&amp;#039;&amp;#039; dispozitivul &amp;#039;&amp;#039;&amp;#039;xc7s50csga324-1&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Tutorial Vivado selectare dispozitiv.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- La acest pas vom alege dispozitivul tinta. In cazul laboratorului nostru, acesta este placuta &amp;#039;&amp;#039;&amp;#039;PYNQ Z2&amp;#039;&amp;#039;&amp;#039;. Mergem la tab-ul &amp;#039;&amp;#039;&amp;#039;Boards&amp;#039;&amp;#039;&amp;#039;, alegem PYNQ Z2, iar apoi dam click pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 5.png|600px]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dupa alegerea dispozitivului, va aparea o pagina cu rezumatul setarilor proiectului. Daca totul este corect, dam click pe &amp;#039;&amp;#039;&amp;#039;Finish&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 6: Pagina principala a proiectului&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 6.png]]&lt;br /&gt;
&lt;br /&gt;
In fereastra principala a proiectului se pot observa urmatoarele zone: &amp;#039;&amp;#039;&amp;#039;Flow navigator&amp;#039;&amp;#039;&amp;#039;, in care avem principalele comenzi utilizate in crearea, simularea, sinteza si implementarea unui circuit digital pe FPGA, &amp;#039;&amp;#039;&amp;#039;Sources&amp;#039;&amp;#039;&amp;#039;, in care vedem lista cu sursele proiectului (fisiere verilog in care descriem modulele, fisiere utilizate in simulare, in care vom descrie modulele de test, fisierele de constrangeri), &amp;#039;&amp;#039;&amp;#039;Consola&amp;#039;&amp;#039;&amp;#039;, in josul paginii si zona &amp;#039;&amp;#039;&amp;#039;Project Sumary&amp;#039;&amp;#039;&amp;#039;, in care se vor deschide fisierele proiectului.&lt;br /&gt;
&lt;br /&gt;
=== Adaugarea sau crearea de fisiere===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 1:&amp;#039;&amp;#039;&amp;#039; In zona &amp;#039;&amp;#039;&amp;#039;Sources&amp;#039;&amp;#039;&amp;#039;, dam click pe &amp;#039;&amp;#039;&amp;#039;+&amp;#039;&amp;#039;&amp;#039;, iar apoi apare pe ecran fereastra in care trebuie sa selectam tipul fisierului: Vom alege &amp;#039;&amp;#039;&amp;#039;Add or create constains&amp;#039;&amp;#039;&amp;#039;, daca dorim crearea sau adaugarea unui fisier de constrangeri, &amp;#039;&amp;#039;&amp;#039;Add or create design sources&amp;#039;&amp;#039;&amp;#039;, in cazul in care dorim crearea sau sa adaugarea de fisiere in care vom descrie modulele digitale, sau &amp;#039;&amp;#039;&amp;#039;Add or create simulation sources&amp;#039;&amp;#039;&amp;#039;, in cazul in care dorim adaugarea sau crearea de fisiere ce vor fi utlizate pentru simulare.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 7.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 2:&amp;#039;&amp;#039;&amp;#039; Daca dorim adaugarea unor fisiere existente, dam click pe &amp;#039;&amp;#039;&amp;#039;Add File&amp;#039;&amp;#039;&amp;#039; si navigam pana la locul in care se afla aceste fisere. Daca dorim crearea unui nou fisier, dam click pe &amp;#039;&amp;#039;&amp;#039;Create File&amp;#039;&amp;#039;&amp;#039;. Se va deschide o frestra mica in care vom completa numele fisierului (de obicei, acesta corespunde cu numele modului descris in interiorul sau) si vom selecta limbajul pe care il vom folosi (Verilog). Dam click pe &amp;#039;&amp;#039;&amp;#039;OK&amp;#039;&amp;#039;&amp;#039;, iar apoi pe &amp;#039;&amp;#039;&amp;#039;Finish&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 8.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 3:&amp;#039;&amp;#039;&amp;#039; Vom completa in urmatoarea fereastra numele modulului descris. Obtional, putem completa si lista porturile impreuna cu tipul si dimensiunea lor, Vivado creand astfel pentru noi scheletele descrierii. &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 9.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 4:&amp;#039;&amp;#039;&amp;#039; Fisierul creat va aparea in &amp;#039;&amp;#039;&amp;#039;Sources&amp;#039;&amp;#039;&amp;#039;. Pentru a-l deschide, vom da doublu-click pe acesta, deschizandu-se in zona &amp;#039;&amp;#039;&amp;#039;Project Summary&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 10.png|780px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Simularea unui circuit digital ===&lt;br /&gt;
Pentru a putea simula un circuit digital, avem nevoie de cel putin doua fisiere: un fisier ce contine descrierea circuitului si un fisier ce contine descrierea modulului de test (test bench). Dupa crearea celor doua module, pentru a rula simularea vom urma pasii urmatori:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 1:&amp;#039;&amp;#039;&amp;#039; In zona &amp;#039;&amp;#039;&amp;#039;Flow navigator&amp;#039;&amp;#039;&amp;#039; dam click pe &amp;#039;&amp;#039;&amp;#039;Run Simulation&amp;#039;&amp;#039;&amp;#039;, iar apoi click pe &amp;#039;&amp;#039;&amp;#039;Run Behavioral Simulation&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 11.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 2:&amp;#039;&amp;#039;&amp;#039; Dupa rularea simularii vom observa pe ecran trei zone principale: &amp;#039;&amp;#039;&amp;#039;Scope&amp;#039;&amp;#039;&amp;#039;, in care vedem modulul si submodulele simulate, &amp;#039;&amp;#039;&amp;#039;Objects&amp;#039;&amp;#039;&amp;#039;, in care vom vedea semnalele din interiorul fiecarui modul/submodul si &amp;#039;&amp;#039;&amp;#039;Wave&amp;#039;&amp;#039;&amp;#039;, in care vom vedea forma de unda obtinuta in urma simularii.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 12.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 3:&amp;#039;&amp;#039;&amp;#039; Putem adauga semnale la forma de unda selectand semnalul dorit din fereastra &amp;#039;&amp;#039;&amp;#039;Objects&amp;#039;&amp;#039;&amp;#039;, dand click dreapta si &amp;#039;&amp;#039;&amp;#039;Add to Wave Window&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 13.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 4:&amp;#039;&amp;#039;&amp;#039; Pentru a observa evolutia in timp a semnalelor nou adaugate, simularea trebuie repornita. Pentru acesta, dam click pe &amp;#039;&amp;#039;&amp;#039;Restart&amp;#039;&amp;#039;&amp;#039;, apoi pe &amp;#039;&amp;#039;&amp;#039;Run All&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 14.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 5:&amp;#039;&amp;#039;&amp;#039; Folosind Zoom In / Zoom Out, stabilim un nivel optim de zoom, astfel incat sa vizualizarea formelor de unda sa fie semnificativa.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 15.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Setarile initiale ale Vivado opresc simularea dupa 1000ns. Daca se doreste o simulare mai lunga si pentru a nu fi nevoie sa se apese run dupa cele 1000ns initiale, se poate introduce &amp;quot;-all&amp;quot; in Settings-&amp;gt;Simulation-&amp;gt;Simulation-&amp;gt;xsim.simulate.runtime.&lt;br /&gt;
&lt;br /&gt;
=== Sinteza și implementarea unui circuit digital pe FPGA ===&lt;br /&gt;
După ce am descris modulul și ne-am asigurat că nu există erori de sintaxă sau chiar erori funcșionale prin simulare, putem merge mai departe la sinteza și implementarea acestuia pe FPGA.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 1: Elaborarea circuitului&amp;#039;&amp;#039;&amp;#039;: La acest pas, utilitarul interpretează codul Verilog, identificând componentele și modul în care ele sunt conectate, generând &amp;#039;&amp;#039;&amp;#039;netlist&amp;#039;&amp;#039;&amp;#039;-ul. Această etapă este independentă de tehnologie.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul1.png|800px]]&lt;br /&gt;
&lt;br /&gt;
După elaborare, putem vizualiza schema circutului din secțiunea &amp;#039;&amp;#039;&amp;#039;Flow Navigator -&amp;gt; RTL ANALYSIS -&amp;gt; Open Elaborated Design -&amp;gt; Schematic&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul1 1.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 2:&amp;#039;&amp;#039;&amp;#039; Vom deschide planificatorul de pini din &amp;#039;&amp;#039;&amp;#039;Layout -&amp;gt; I/O planning&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 3: Asocierea pinilor plăcii cu porturile circuitului&amp;#039;&amp;#039;&amp;#039; La acest pas vom asocia porturile circuitului descris cu [[Pynq-Z2 - Pinout|pinii plăcii FPGA]]. În plus, vom selecta pentru toți pinii standardul &amp;#039;&amp;#039;&amp;#039;LVCMOS33&amp;#039;&amp;#039;&amp;#039; (coloana &amp;#039;&amp;#039;&amp;#039;I/O Std&amp;#039;&amp;#039;&amp;#039;). Aceasta este o caracteristică hardware și poate diferi de la un dispozitiv la altul.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul3.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 4: Sinteza circuitului&amp;#039;&amp;#039;&amp;#039; La acest pas se realizează transformarea circuitului descris într-un netlist dependent de tehnologie. Se vor folosi la acest pas primitivele disponibile pe FPGA. În plus, deoarece am introdus în I/O Planning constrângerile legate de legarea porturilor la pinii plăcii, tot aici va fi integrată și această informație.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul4.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 5: Implementarea circuitului&amp;#039;&amp;#039;&amp;#039; La acest pas se preia netlist-ul ce conține primitivele FPGA și modul lor de interconectare realizat la pasul anterior și se realizează maparea lor efectivă în FPGA (place and route).&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul5.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 6:&amp;#039;&amp;#039;&amp;#039; După implementare, putem deschide circuitul elaborat pentru a studia căteva elemente precum schema circuitului sintetizat sau diverse rapoarte de sinteză.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul6.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Schema circuitului cu componente disponibile pe FPGA.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul6 1.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Fișierul de constrângeri generat. Acesta putea fi adăugat la proiect și scris manual, dacă nu doream să utilizîm I/O Planning.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul6 2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 7: Generare a fișierului de programare&amp;#039;&amp;#039;&amp;#039; Din circuitul de la punctul anterior, se generează un fișier cu extensia .bit care conține biții de configurare pentru blocurile logice, blocurile de I/O și blocurile de interconectare corespunzătoare circuitului.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul7.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 8: Conectarea la placa FPGA&amp;#039;&amp;#039;&amp;#039; Se deschide managerul hardware și ne conectăm la placa FPGA prin Auto Connect. Aceeași operațiunea poate fi realizată și din &amp;#039;&amp;#039;&amp;#039;Flow Navigator -&amp;gt; PROGRAM AND DEBUG -&amp;gt; Open Hardware Manager -&amp;gt; Open Target -&amp;gt; Auto Connect&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul8.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 9: Programarea plăcii&amp;#039;&amp;#039;&amp;#039; La acest pas se descarcă fișierul de configurare pe placă.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul9.png|800px]]&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Tutorial_Vivado&amp;diff=7474</id>
		<title>Tutorial Vivado</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Tutorial_Vivado&amp;diff=7474"/>
		<updated>2023-02-22T10:47:39Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Utilizarea Vivado pentru simularea si sinteza circuitelor digitale */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Instalare Vivado ==&lt;br /&gt;
Pentru a instala utilitarul Vivado, acesta trebuie descarcat de pe site-ul [https://www.xilinx.com/support/download.html Xilinx], alegand versiunea potrivita sistemului de operare folosit. Pentru a putea descarca orice utilitar Xilinx, va trebui mai intai sa creati un cont. Pentru instalarea Vivado 2020.2 pe sistemul de operare Windows, puteti consulta pagina [[Tutorial instalare Vivado]].&lt;br /&gt;
&lt;br /&gt;
== Utilizarea Vivado pentru simularea si sinteza circuitelor digitale ==&lt;br /&gt;
=== Crearea unui proiect ===&lt;br /&gt;
Pentru a crea un proiect nou, mergeti la &amp;#039;&amp;#039;&amp;#039;File-&amp;gt;Project-&amp;gt;New&amp;#039;&amp;#039;&amp;#039;, iar apoi vom urma pasii de configurare:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 1: Denumirea proiectului si stabilirea caii catre acesta&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
La acest pas vom denumi proiectul (de obicei, numele trebuie sa corespunda cu numele modulului TOP) si vom stabili calea la care se va crea acesta.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas1.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 2: Alegerea tipului proiectului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
La acest pas, vom selecta RTL Project, apoi vom da click pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 2.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 3: Adaugarea surselor deja existente&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
La acest pas vom adauga proiectului sursele modulelor pentru care avem deja descrierea in fisiere de tip Verilog. Acest lucru se face prin &amp;#039;&amp;#039;&amp;#039;Add Files&amp;#039;&amp;#039;&amp;#039; si selectarea acestora. Daca nu avem fisiere de adaugat, putem da click direct pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 3.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 4: Adaugarea fisierelor de constrangeri&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
La acest pas vom adauga fisierele de constrangeri pentru sinteza si implemenatrea pe FPGA, daca este cazul. Daca nu, putem da direct click pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 4.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 5: Alegerea dispozitivului tinta&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Se selecteaza din meniul &amp;#039;&amp;#039;&amp;#039;Parts&amp;#039;&amp;#039;&amp;#039; dispozitivul &amp;#039;&amp;#039;&amp;#039;xc7s50csga342-1&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Tutorial Vivado selectare dispozitiv.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- La acest pas vom alege dispozitivul tinta. In cazul laboratorului nostru, acesta este placuta &amp;#039;&amp;#039;&amp;#039;PYNQ Z2&amp;#039;&amp;#039;&amp;#039;. Mergem la tab-ul &amp;#039;&amp;#039;&amp;#039;Boards&amp;#039;&amp;#039;&amp;#039;, alegem PYNQ Z2, iar apoi dam click pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 5.png|600px]] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dupa alegerea dispozitivului, va aparea o pagina cu rezumatul setarilor proiectului. Daca totul este corect, dam click pe &amp;#039;&amp;#039;&amp;#039;Finish&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 6: Pagina principala a proiectului&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 6.png]]&lt;br /&gt;
&lt;br /&gt;
In fereastra principala a proiectului se pot observa urmatoarele zone: &amp;#039;&amp;#039;&amp;#039;Flow navigator&amp;#039;&amp;#039;&amp;#039;, in care avem principalele comenzi utilizate in crearea, simularea, sinteza si implementarea unui circuit digital pe FPGA, &amp;#039;&amp;#039;&amp;#039;Sources&amp;#039;&amp;#039;&amp;#039;, in care vedem lista cu sursele proiectului (fisiere verilog in care descriem modulele, fisiere utilizate in simulare, in care vom descrie modulele de test, fisierele de constrangeri), &amp;#039;&amp;#039;&amp;#039;Consola&amp;#039;&amp;#039;&amp;#039;, in josul paginii si zona &amp;#039;&amp;#039;&amp;#039;Project Sumary&amp;#039;&amp;#039;&amp;#039;, in care se vor deschide fisierele proiectului.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Adaugarea sau crearea de fisiere===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 1:&amp;#039;&amp;#039;&amp;#039; In zona &amp;#039;&amp;#039;&amp;#039;Sources&amp;#039;&amp;#039;&amp;#039;, dam click pe &amp;#039;&amp;#039;&amp;#039;+&amp;#039;&amp;#039;&amp;#039;, iar apoi apare pe ecran fereastra in care trebuie sa selectam tipul fisierului: Vom alege &amp;#039;&amp;#039;&amp;#039;Add or create constains&amp;#039;&amp;#039;&amp;#039;, daca dorim crearea sau adaugarea unui fisier de constrangeri, &amp;#039;&amp;#039;&amp;#039;Add or create design sources&amp;#039;&amp;#039;&amp;#039;, in cazul in care dorim crearea sau sa adaugarea de fisiere in care vom descrie modulele digitale, sau &amp;#039;&amp;#039;&amp;#039;Add or create simulation sources&amp;#039;&amp;#039;&amp;#039;, in cazul in care dorim adaugarea sau crearea de fisiere ce vor fi utlizate pentru simulare.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 7.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 2:&amp;#039;&amp;#039;&amp;#039; Daca dorim adaugarea unor fisiere existente, dam click pe &amp;#039;&amp;#039;&amp;#039;Add File&amp;#039;&amp;#039;&amp;#039; si navigam pana la locul in care se afla aceste fisere. Daca dorim crearea unui nou fisier, dam click pe &amp;#039;&amp;#039;&amp;#039;Create File&amp;#039;&amp;#039;&amp;#039;. Se va deschide o frestra mica in care vom completa numele fisierului (de obicei, acesta corespunde cu numele modului descris in interiorul sau) si vom selecta limbajul pe care il vom folosi (Verilog). Dam click pe &amp;#039;&amp;#039;&amp;#039;OK&amp;#039;&amp;#039;&amp;#039;, iar apoi pe &amp;#039;&amp;#039;&amp;#039;Finish&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 8.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 3:&amp;#039;&amp;#039;&amp;#039; Vom completa in urmatoarea fereastra numele modulului descris. Obtional, putem completa si lista porturile impreuna cu tipul si dimensiunea lor, Vivado creand astfel pentru noi scheletele descrierii. &lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 9.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 4:&amp;#039;&amp;#039;&amp;#039; Fisierul creat va aparea in &amp;#039;&amp;#039;&amp;#039;Sources&amp;#039;&amp;#039;&amp;#039;. Pentru a-l deschide, vom da doublu-click pe acesta, deschizandu-se in zona &amp;#039;&amp;#039;&amp;#039;Project Summary&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 10.png|780px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Simularea unui circuit digital ===&lt;br /&gt;
Pentru a putea simula un circuit digital, avem nevoie de cel putin doua fisiere: un fisier ce contine descrierea circuitului si un fisier ce contine descrierea modulului de test (test bench). Dupa crearea celor doua module, pentru a rula simularea vom urma pasii urmatori:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 1:&amp;#039;&amp;#039;&amp;#039; In zona &amp;#039;&amp;#039;&amp;#039;Flow navigator&amp;#039;&amp;#039;&amp;#039; dam click pe &amp;#039;&amp;#039;&amp;#039;Run Simulation&amp;#039;&amp;#039;&amp;#039;, iar apoi click pe &amp;#039;&amp;#039;&amp;#039;Run Behavioral Simulation&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 11.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 2:&amp;#039;&amp;#039;&amp;#039; Dupa rularea simularii vom observa pe ecran trei zone principale: &amp;#039;&amp;#039;&amp;#039;Scope&amp;#039;&amp;#039;&amp;#039;, in care vedem modulul si submodulele simulate, &amp;#039;&amp;#039;&amp;#039;Objects&amp;#039;&amp;#039;&amp;#039;, in care vom vedea semnalele din interiorul fiecarui modul/submodul si &amp;#039;&amp;#039;&amp;#039;Wave&amp;#039;&amp;#039;&amp;#039;, in care vom vedea forma de unda obtinuta in urma simularii.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 12.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 3:&amp;#039;&amp;#039;&amp;#039; Putem adauga semnale la forma de unda selectand semnalul dorit din fereastra &amp;#039;&amp;#039;&amp;#039;Objects&amp;#039;&amp;#039;&amp;#039;, dand click dreapta si &amp;#039;&amp;#039;&amp;#039;Add to Wave Window&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 13.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 4:&amp;#039;&amp;#039;&amp;#039; Pentru a observa evolutia in timp a semnalelor nou adaugate, simularea trebuie repornita. Pentru acesta, dam click pe &amp;#039;&amp;#039;&amp;#039;Restart&amp;#039;&amp;#039;&amp;#039;, apoi pe &amp;#039;&amp;#039;&amp;#039;Run All&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 14.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 5:&amp;#039;&amp;#039;&amp;#039; Folosind Zoom In / Zoom Out, stabilim un nivel optim de zoom, astfel incat sa vizualizarea formelor de unda sa fie semnificativa.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial pas 15.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Setarile initiale ale Vivado opresc simularea dupa 1000ns. Daca se doreste o simulare mai lunga si pentru a nu fi nevoie sa se apese run dupa cele 1000ns initiale, se poate introduce &amp;quot;-all&amp;quot; in Settings-&amp;gt;Simulation-&amp;gt;Simulation-&amp;gt;xsim.simulate.runtime.&lt;br /&gt;
&lt;br /&gt;
=== Sinteza și implementarea unui circuit digital pe FPGA ===&lt;br /&gt;
După ce am descris modulul și ne-am asigurat că nu există erori de sintaxă sau chiar erori funcșionale prin simulare, putem merge mai departe la sinteza și implementarea acestuia pe FPGA.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 1: Elaborarea circuitului&amp;#039;&amp;#039;&amp;#039;: La acest pas, utilitarul interpretează codul Verilog, identificând componentele și modul în care ele sunt conectate, generând &amp;#039;&amp;#039;&amp;#039;netlist&amp;#039;&amp;#039;&amp;#039;-ul. Această etapă este independentă de tehnologie.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul1.png|800px]]&lt;br /&gt;
&lt;br /&gt;
După elaborare, putem vizualiza schema circutului din secțiunea &amp;#039;&amp;#039;&amp;#039;Flow Navigator -&amp;gt; RTL ANALYSIS -&amp;gt; Open Elaborated Design -&amp;gt; Schematic&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul1 1.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 2:&amp;#039;&amp;#039;&amp;#039; Vom deschide planificatorul de pini din &amp;#039;&amp;#039;&amp;#039;Layout -&amp;gt; I/O planning&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 3: Asocierea pinilor plăcii cu porturile circuitului&amp;#039;&amp;#039;&amp;#039; La acest pas vom asocia porturile circuitului descris cu [[Pynq-Z2 - Pinout|pinii plăcii FPGA]]. În plus, vom selecta pentru toți pinii standardul &amp;#039;&amp;#039;&amp;#039;LVCMOS33&amp;#039;&amp;#039;&amp;#039; (coloana &amp;#039;&amp;#039;&amp;#039;I/O Std&amp;#039;&amp;#039;&amp;#039;). Aceasta este o caracteristică hardware și poate diferi de la un dispozitiv la altul.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul3.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 4: Sinteza circuitului&amp;#039;&amp;#039;&amp;#039; La acest pas se realizează transformarea circuitului descris într-un netlist dependent de tehnologie. Se vor folosi la acest pas primitivele disponibile pe FPGA. În plus, deoarece am introdus în I/O Planning constrângerile legate de legarea porturilor la pinii plăcii, tot aici va fi integrată și această informație.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul4.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 5: Implementarea circuitului&amp;#039;&amp;#039;&amp;#039; La acest pas se preia netlist-ul ce conține primitivele FPGA și modul lor de interconectare realizat la pasul anterior și se realizează maparea lor efectivă în FPGA (place and route).&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul5.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 6:&amp;#039;&amp;#039;&amp;#039; După implementare, putem deschide circuitul elaborat pentru a studia căteva elemente precum schema circuitului sintetizat sau diverse rapoarte de sinteză.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul6.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Schema circuitului cu componente disponibile pe FPGA.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul6 1.png|800px]]&lt;br /&gt;
&lt;br /&gt;
Fișierul de constrângeri generat. Acesta putea fi adăugat la proiect și scris manual, dacă nu doream să utilizîm I/O Planning.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul6 2.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 7: Generare a fișierului de programare&amp;#039;&amp;#039;&amp;#039; Din circuitul de la punctul anterior, se generează un fișier cu extensia .bit care conține biții de configurare pentru blocurile logice, blocurile de I/O și blocurile de interconectare corespunzătoare circuitului.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul7.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 8: Conectarea la placa FPGA&amp;#039;&amp;#039;&amp;#039; Se deschide managerul hardware și ne conectăm la placa FPGA prin Auto Connect. Aceeași operațiunea poate fi realizată și din &amp;#039;&amp;#039;&amp;#039;Flow Navigator -&amp;gt; PROGRAM AND DEBUG -&amp;gt; Open Hardware Manager -&amp;gt; Open Target -&amp;gt; Auto Connect&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul8.png|800px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 9: Programarea plăcii&amp;#039;&amp;#039;&amp;#039; La acest pas se descarcă fișierul de configurare pe placă.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado tutorial sinteza pasul9.png|800px]]&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Tutorial_Vivado_selectare_dispozitiv.png&amp;diff=7473</id>
		<title>Fișier:Tutorial Vivado selectare dispozitiv.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Tutorial_Vivado_selectare_dispozitiv.png&amp;diff=7473"/>
		<updated>2023-02-22T10:46:27Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Tutorial_instalare_Vivado&amp;diff=7472</id>
		<title>Tutorial instalare Vivado</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Tutorial_instalare_Vivado&amp;diff=7472"/>
		<updated>2023-02-22T10:36:41Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In cele ce urmeaza, vom exemplifica instalarea utilitarului Vivado 2020.2 pentru sistemul de operare Windows. Trebuie sa aveti in vedere inca de la inceput faptul ca acest utilitar are o dimensiune mare, iar descarcarea si instalarea dureaza destul de mult.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 1:&amp;#039;&amp;#039;&amp;#039; Accesati [https://www.xilinx.com/support/download.html pagina de descarcare] de pe site-ul Xilinx. Aici veti gasi la sectiunea Vivado (HW Developer) versiunea disponibile ale utilitarului. Selectati versiunea dorita (in timpul laboratorului, vom folosi versiunea 2020.2) si veti descarca utilitarul de instalare corespunzator sistemului de operare folosit (in cazul acestui tutorial, Windows).  &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 2:&amp;#039;&amp;#039;&amp;#039; Selectati  &amp;#039;&amp;#039;&amp;#039;Xilinx Unified Installer 2020.2: Windows Self Extracting Web Installer&amp;#039;&amp;#039;&amp;#039;. Pentru a putea incepe descarcarea, trebuie sa intrati in contul Xilinx personal, sau sa creati unul. Pentru crearea contului, va trebui sa completati campurile obligatorii cu datele voastre. Pentru datele companiei, puteti completa numele si adresa UPB. Odata completate datele, dati click pe butonul &amp;#039;&amp;#039;&amp;#039;Download&amp;#039;&amp;#039;&amp;#039; din partea de jos a paginii.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 3:&amp;#039;&amp;#039;&amp;#039; Dupa terminarea descarcarii, rulati executabilul de instalare.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 4:&amp;#039;&amp;#039;&amp;#039; In fereastra de intampinare va sunt prezentate sistemele de operare suportate de acest utilitar. Dati click pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado instalare pas1.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 5:&amp;#039;&amp;#039;&amp;#039; In urmatoare fereastra, introduceti datele de autentificare in contul Xilinx si asigurati-va ca este selectat &amp;#039;&amp;#039;&amp;#039;Download and Install …&amp;#039;&amp;#039;&amp;#039; , apoi dati click pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado instalare pas2.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 6:&amp;#039;&amp;#039;&amp;#039; Urmeaza apoi selectarea produsului pe care doriti sa il descarcati. Selectati &amp;#039;&amp;#039;&amp;#039;Vivado&amp;#039;&amp;#039;&amp;#039;, apoi dati click pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado instalare pas3.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 7:&amp;#039;&amp;#039;&amp;#039; In fereastra &amp;#039;&amp;#039;&amp;#039;Select Edition to Install&amp;#039;&amp;#039;&amp;#039;, selectati &amp;#039;&amp;#039;&amp;#039;Vivado HL WebPACK&amp;#039;&amp;#039;&amp;#039;, apoi dati click pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado instalare pas4.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 8:&amp;#039;&amp;#039;&amp;#039; In fereastra &amp;#039;&amp;#039;&amp;#039;Vivado HL WebPACK&amp;#039;&amp;#039;&amp;#039; aveti posibilitatea de a selecta doar anumite placi FPGA pentru care doriti instalarea. Pentru a reduce resursele ocupate de utilitar, puteti lasa selectat doar &amp;#039;&amp;#039;&amp;#039;SoCs&amp;#039;&amp;#039;&amp;#039; si &amp;#039;&amp;#039;&amp;#039;7 Series&amp;#039;&amp;#039;&amp;#039;. De asemenea, puteti deselecta &amp;#039;&amp;#039;&amp;#039;DocNav&amp;#039;&amp;#039;&amp;#039;. Dati apoi click pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado instalare pas5.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 9:&amp;#039;&amp;#039;&amp;#039; In fereastra &amp;#039;&amp;#039;&amp;#039;Accept License Agreements&amp;#039;&amp;#039;&amp;#039;, validati cele trei casute &amp;#039;&amp;#039;&amp;#039;I Agree&amp;#039;&amp;#039;&amp;#039;. Dati apoi click pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Vivado instalare pas6.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 10:&amp;#039;&amp;#039;&amp;#039; In fereastra &amp;#039;&amp;#039;&amp;#039;Select Destination Directory&amp;#039;&amp;#039;&amp;#039; selectati locul in care doriti instalarea. Desi implicit instalarea se face in C:/, trebuie sa tineti cont de dimensiunea destul de mare a acesteia. Selectati, asadar, locul de instalare convenabil, apoi dati click pe &amp;#039;&amp;#039;&amp;#039;Next&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 11:&amp;#039;&amp;#039;&amp;#039; Ultima fereastra este &amp;#039;&amp;#039;&amp;#039;Installation Sumary&amp;#039;&amp;#039;&amp;#039;. Verificati selectiile facute, apoi dati click pe Install. Va incepe apoi descarcarea si instalarea. &lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pasul 12: (Opțional - doar pentru PYNQ)&amp;#039;&amp;#039;&amp;#039; Dupa instalarea Vivado va trebui sa instalam fisierele placutei PINQ Z2. Descarcati arhiva PYNQ Z2 de [https://dpoauwgwqsy2x.cloudfront.net/Download/pynq-z2.zip aici], dezarhivati, apoi mutati folder-ul rezultat in &amp;#039;&amp;#039;&amp;#039;&amp;lt;Xilinx installation directory&amp;gt;\Vivado\&amp;lt;version&amp;gt;\data\boards\board_files&amp;#039;&amp;#039;&amp;#039; (daca folder-ul &amp;#039;&amp;#039;&amp;#039;board_files&amp;#039;&amp;#039;&amp;#039; nu exista, va trebui creat).&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Boolean_Board_-_Pinout&amp;diff=7471</id>
		<title>Boolean Board - Pinout</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Boolean_Board_-_Pinout&amp;diff=7471"/>
		<updated>2023-02-22T10:34:05Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Boolean Board - Pinout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Boolean Board - Pinout==&lt;br /&gt;
&lt;br /&gt;
Aici veți găsi lista cu corespondența pin - componentă pentru placa Boolean Board de la Real Digital. Aceasta se folosește fie în fișierul XDC cu constrângeri, fie în etapa &amp;#039;&amp;#039;Elaboration&amp;#039;&amp;#039;, atunci când se selectează conexiunile fizice dorite între intrările și ieșirile circuitului și componentele de pe placă (LED-uri, butoane, comutatoare, etc.).&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Boolean board.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pentru funcționarea corectă a plăcii se va selecta &amp;quot;LVCMOS33&amp;quot; ca standard de I/O, unde &amp;quot;33&amp;quot; vine de la 3.3V.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Comutatoare&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW0 || V2 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW1 || U2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW2 || U1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW3 || T2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW4 || T1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW5 || R2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW6 || R1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW7 || P2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW8 || P1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW9 || N2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW10 || N1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW11 || M2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW12 || M1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW13 || L1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW14 || K2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW15 || K1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Butoane&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN0 || J2 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN1 || J5 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN2 || H2 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN3 || J1 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;LED-uri&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED0 || G1 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED1 || G2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED2 || F1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED3 || F2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED4 || E1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED5 || E2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED6 || E3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED7 || E5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED8 || E6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED9 || C3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED10 || B2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED11 || A2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED12 || B3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED13 || A3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED14 || B4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED15 || A4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;LED-uri RGB&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB0_RED || V6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB0_GREEN || V4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB0_BLUE || U6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB1_RED || U3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB1_GREEN || V3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB1_BLUE || V5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Afisajul cu 7 segmente&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Afisaj7Segmente.png|200px]]&lt;br /&gt;
&lt;br /&gt;
Observație: Semnalele de control pentru aprinderea segmentelor și selecția cifrelor sunt active in 0. Numerotarea cifrelor dintr-un grup se face de la drepta la stânga.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Grupul 0 (LEFT)&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 0 || D7&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 1 || C5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 2 || A5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 3 || B7&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 4 || A7&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 5 || D6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 6 || B5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Punctul || A6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 0 || D5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 1 || C4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 2 || C7&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 3 || A8&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Grupul 1 (RIGHT)&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 0 || F4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 1 || J3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 2 || D2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 3 || C2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 4 || B1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 5 || H4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 6 || D1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Punctul || C1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 0 || H3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 1 || J4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 2 || F3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 3 || E4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pentru lista completă a pinilor puteți accesa [https://www.realdigital.org/hardware/boolean Boolean Board - pagina oficiala] - secțiunea &amp;#039;&amp;#039;User manual&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;Master XDC&amp;#039;&amp;#039;.&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Afisaj7Segmente.png&amp;diff=7470</id>
		<title>Fișier:Afisaj7Segmente.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Afisaj7Segmente.png&amp;diff=7470"/>
		<updated>2023-02-22T10:33:11Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Boolean_Board_-_Pinout&amp;diff=7469</id>
		<title>Boolean Board - Pinout</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Boolean_Board_-_Pinout&amp;diff=7469"/>
		<updated>2023-02-22T10:22:15Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Boolean Board - Pinout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Boolean Board - Pinout==&lt;br /&gt;
&lt;br /&gt;
Aici veți găsi lista cu corespondența pin - componentă pentru placa Boolean Board de la Real Digital. Aceasta se folosește fie în fișierul XDC cu constrângeri, fie în etapa &amp;#039;&amp;#039;Elaboration&amp;#039;&amp;#039;, atunci când se selectează conexiunile fizice dorite între intrările și ieșirile circuitului și componentele de pe placă (LED-uri, butoane, comutatoare, etc.).&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Boolean board.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Pentru funcționarea corectă a plăcii se va selecta &amp;quot;LVCMOS33&amp;quot; ca standard de I/O, unde &amp;quot;33&amp;quot; vine de la 3.3V.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Comutatoare&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW0 || V2 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW1 || U2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW2 || U1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW3 || T2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW4 || T1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW5 || R2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW6 || R1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW7 || P2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW8 || P1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW9 || N2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW10 || N1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW11 || M2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW12 || M1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW13 || L1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW14 || K2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW15 || K1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Butoane&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN0 || J2 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN1 || J5 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN2 || H2 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN3 || J1 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;LED-uri&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED0 || G1 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED1 || G2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED2 || F1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED3 || F2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED4 || E1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED5 || E2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED6 || E3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED7 || E5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED8 || E6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED9 || C3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED10 || B2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED11 || A2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED12 || B3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED13 || A3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED14 || B4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED15 || A4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;LED-uri RGB&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB0_RED || V6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB0_GREEN || V4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB0_BLUE || U6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB1_RED || U3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB1_GREEN || V3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB1_BLUE || V5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Afisajul cu 7 segmente&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Observație: Semnalele de control pentru aprinderea segmentelor și selecția cifrelor sunt active in 0. Numerotarea cifrelor dintr-un grup se face de la drepta la stânga.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Grupul 0 (LEFT)&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 0 || D7&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 1 || C5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 2 || A5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 3 || B7&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 4 || A7&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 5 || D6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 6 || B5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Punctul || A6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 0 || D5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 1 || C4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 2 || C7&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 3 || A8&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Grupul 1 (RIGHT)&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 0 || F4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 1 || J3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 2 || D2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 3 || C2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 4 || B1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 5 || H4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 6 || D1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Punctul || C1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 0 || H3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 1 || J4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 2 || F3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 3 || E4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pentru lista completă a pinilor puteți accesa [https://www.realdigital.org/hardware/boolean Boolean Board - pagina oficiala] - secțiunea &amp;#039;&amp;#039;User manual&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;Master XDC&amp;#039;&amp;#039;.&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Boolean_Board_-_Pinout&amp;diff=7468</id>
		<title>Boolean Board - Pinout</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Boolean_Board_-_Pinout&amp;diff=7468"/>
		<updated>2023-02-22T10:16:36Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Boolean Board - Pinout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Boolean Board - Pinout==&lt;br /&gt;
&lt;br /&gt;
Aici veți găsi lista cu corespondența pin - componentă pentru placa Boolean Board de la Real Digital. Aceasta se folosește fie în fișierul XDC cu constrângeri, fie în etapa &amp;#039;&amp;#039;Elaboration&amp;#039;&amp;#039;, atunci când se selectează conexiunile fizice dorite între intrările și ieșirile circuitului și componentele de pe placă (LED-uri, butoane, comutatoare, etc.).&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Boolean board.png]]&lt;br /&gt;
&lt;br /&gt;
Pentru funcționarea corectă a plăcii se va selecta &amp;quot;LVCMOS33&amp;quot; ca standard de I/O, unde &amp;quot;33&amp;quot; vine de la 3.3V.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Comutatoare&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW0 || V2 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW1 || U2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW2 || U1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW3 || T2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW4 || T1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW5 || R2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW6 || R1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW7 || P2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW8 || P1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW9 || N2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW10 || N1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW11 || M2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW12 || M1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW13 || L1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW14 || K2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW15 || K1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Butoane&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN0 || J2 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN1 || J5 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN2 || H2 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN3 || J1 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;LED-uri&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED0 || G1 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED1 || G2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED2 || F1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED3 || F2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED4 || E1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED5 || E2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED6 || E3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED7 || E5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED8 || E6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED9 || C3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED10 || B2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED11 || A2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED12 || B3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED13 || A3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED14 || B4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED15 || A4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;LED-uri RGB&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB0_RED || V6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB0_GREEN || V4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB0_BLUE || U6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB1_RED || U3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB1_GREEN || V3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB1_BLUE || V5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Afisajul cu 7 segmente&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Grupul 0 (LEFT)&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 0 || D7&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 1 || C5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 2 || A5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 3 || B7&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 4 || A7&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 5 || D6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 6 || B5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Punctul || A6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 0 || D5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 1 || C4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 2 || C7&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 3 || A8&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Grupul 1 (RIGHT)&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 0 || F4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 1 || J3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 2 || D2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 3 || C2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 4 || B1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 5 || H4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 6 || D1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Punctul || C1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 0 || H3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 1 || J4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 2 || F3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 3 || E4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pentru lista completă a pinilor puteți accesa [https://www.realdigital.org/hardware/boolean Boolean Board - pagina oficiala] - secțiunea &amp;#039;&amp;#039;User manual&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;Master XDC&amp;#039;&amp;#039;.&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Boolean_board.png&amp;diff=7467</id>
		<title>Fișier:Boolean board.png</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Boolean_board.png&amp;diff=7467"/>
		<updated>2023-02-22T10:16:01Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Boolean_board.pdf&amp;diff=7466</id>
		<title>Fișier:Boolean board.pdf</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Boolean_board.pdf&amp;diff=7466"/>
		<updated>2023-02-22T10:14:07Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Boolean_board.svg&amp;diff=7465</id>
		<title>Fișier:Boolean board.svg</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Fi%C8%99ier:Boolean_board.svg&amp;diff=7465"/>
		<updated>2023-02-22T10:10:42Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Boolean_Board_-_Pinout&amp;diff=7464</id>
		<title>Boolean Board - Pinout</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Boolean_Board_-_Pinout&amp;diff=7464"/>
		<updated>2023-02-22T09:46:39Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Boolean Board - Pinout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Boolean Board - Pinout==&lt;br /&gt;
&lt;br /&gt;
Aici veți găsi lista cu corespondența pin - componentă pentru placa Boolean Board de la Real Digital. Aceasta se folosește fie în fișierul XDC cu constrângeri, fie în etapa &amp;#039;&amp;#039;Elaboration&amp;#039;&amp;#039;, atunci când se selectează conexiunile fizice dorite între intrările și ieșirile circuitului și componentele de pe placă (LED-uri, butoane, comutatoare, etc.).&lt;br /&gt;
&lt;br /&gt;
Pentru funcționarea corectă a plăcii se va selecta &amp;quot;LVCMOS33&amp;quot; ca standard de I/O, unde &amp;quot;33&amp;quot; vine de la 3.3V.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Comutatoare&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW0 || V2 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW1 || U2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW2 || U1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW3 || T2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW4 || T1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW5 || R2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW6 || R1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW7 || P2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW8 || P1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW9 || N2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW10 || N1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW11 || M2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW12 || M1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW13 || L1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW14 || K2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW15 || K1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Butoane&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN0 || J2 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN1 || J5 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN2 || H2 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN3 || J1 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;LED-uri&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED0 || G1 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED1 || G2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED2 || F1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED3 || F2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED4 || E1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED5 || E2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED6 || E3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED7 || E5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED8 || E6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED9 || C3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED10 || B2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED11 || A2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED12 || B3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED13 || A3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED14 || B4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED15 || A4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;LED-uri RGB&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB0_RED || V6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB0_GREEN || V4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB0_BLUE || U6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB1_RED || U3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB1_GREEN || V3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB1_BLUE || V5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Afisajul cu 7 segmente&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Grupul 0 (LEFT)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 0 || D7&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 1 || C5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 2 || A5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 3 || B7&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 4 || A7&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 5 || D6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 6 || B5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Punctul || A6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 0 || D5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 1 || C4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 2 || C7&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 3 || A8&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Grupul 1 (RIGHT)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 0 || F4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 1 || J3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 2 || D2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 3 || C2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 4 || B1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 5 || H4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Segmentul 6 || D1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Punctul || C1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 0 || H3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 1 || J4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 2 || F3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|Selectie Cifra 3 || E4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pentru lista completă a pinilor puteți accesa [https://www.realdigital.org/hardware/boolean Boolean Board - pagina oficiala] - secțiunea &amp;#039;&amp;#039;User manual&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;Master XDC&amp;#039;&amp;#039;.&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Boolean_Board_-_Pinout&amp;diff=7463</id>
		<title>Boolean Board - Pinout</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Boolean_Board_-_Pinout&amp;diff=7463"/>
		<updated>2023-02-22T09:36:51Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Boolean Board - Pinout */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Boolean Board - Pinout==&lt;br /&gt;
&lt;br /&gt;
Aici veți găsi lista cu corespondența pin - componentă pentru placa Boolean Board de la Real Digital. Aceasta se folosește fie în fișierul XDC cu constrângeri, fie în etapa &amp;#039;&amp;#039;Elaboration&amp;#039;&amp;#039;, atunci când se selectează conexiunile fizice dorite între intrările și ieșirile circuitului și componentele de pe placă (LED-uri, butoane, comutatoare, etc.).&lt;br /&gt;
&lt;br /&gt;
Pentru funcționarea corectă a plăcii se va selecta &amp;quot;LVCMOS33&amp;quot; ca standard de I/O, unde &amp;quot;33&amp;quot; vine de la 3.3V.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Comutatoare&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW0 || V2 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW1 || U2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW2 || U1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW3 || T2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW4 || T1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW5 || R2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW6 || R1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW7 || P2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW8 || P1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW9 || N2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW10 || N1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW11 || M2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW12 || M1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW13 || L1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW14 || K2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|SW15 || K1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Butoane&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN0 || J2 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN1 || J5 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN2 || H2 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|BTN3 || J1 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;LED-uri&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED0 || G1 &lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED1 || G2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED2 || F1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED3 || F2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED4 || E1&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED5 || E2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED6 || E3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED7 || E5&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED8 || E6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED9 || C3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED10 || B2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED11 || A2&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED12 || B3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED13 || A3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED14 || B4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|LED15 || A4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;LED-uri RGB&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|- bgcolor=&amp;quot;#ddeeff&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
| Componenta || Pin&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB0_RED || V6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB0_GREEN || V4&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB0_BLUE || U6&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB1_RED || U3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB1_GREEN || V3&lt;br /&gt;
|- bgcolor=&amp;quot;#ddffdd&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|RGB1_BLUE || V5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Pentru lista completă a pinilor puteți accesa [https://www.realdigital.org/hardware/boolean Boolean Board - pagina oficiala] - secțiunea &amp;#039;&amp;#039;User manual&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;Master XDC&amp;#039;&amp;#039;.&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=Circuite_Integrate_Digitale&amp;diff=7462</id>
		<title>Circuite Integrate Digitale</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=Circuite_Integrate_Digitale&amp;diff=7462"/>
		<updated>2023-02-22T09:15:54Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Tutoriale și documentații */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Scopul laboratorului ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Laboratorul de circuite integrate digitale vine ca o completare practica a cursului de CID. &lt;br /&gt;
Prin definitie, acesta se va axa pe elemente practice de simulare, sinteza si testare a circuitelor ce sunt prezentate la curs. &lt;br /&gt;
&lt;br /&gt;
Acest laborator se bazeaza pe limbajul &amp;quot;Verilog&amp;quot;, acesta fiind unul din cele 2 limbaje de descriere hardware folosite in industrie la ora actuala (celalalt fiind &amp;quot;VHDL&amp;quot;). &lt;br /&gt;
&lt;br /&gt;
Platformele sunt structurate astfel incat sa contina cateva elemente de teorie minimala, un exemplu de circuit descris in cod Verilog si apoi exercitii pe care sa le rezolvati in ora de aplicatii (simulare/testare pe placa FPGA) si acasa (simulare). &lt;br /&gt;
&lt;br /&gt;
In laborator se va lucra in Vivado, program al firmei Xilinx, pe o placa PYNQ-Z2 impreuna cu o placa de extensie ce adauga leduri si butoane suplimentare. &lt;br /&gt;
&lt;br /&gt;
Circuitele digitale sunt o parte fundamentala a electronici moderne, cu numeroase oportunitati in industrie, atat in design cat si in verificarea circuitelor.&lt;br /&gt;
&lt;br /&gt;
Pe langa ce veti invata in acest laborator, limbajul ofera si capabilitati mai avansate pentru a descrie mai eficient circuitele dorite, cat si pentru testarea acestora. Sintaxa nu se termina cu ce invatati aici si pentru cei pasionati, nu ezitati sa va contactati cadrul didactic cu intrebari.&lt;br /&gt;
&lt;br /&gt;
Speram ca o sa va placa, veti invata si vi se va parea interesant ce veti vedea in orele de aplicatii ce urmeaza. Spor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tutoriale și documentații ==&lt;br /&gt;
&lt;br /&gt;
Programul Vivado este gratuit (necesita cont, dar este gratis) si poate fi descarcat si instalat urmand tutorialul de aici:&lt;br /&gt;
# [[Tutorial instalare Vivado]]&lt;br /&gt;
# [[Tutorial Vivado]].&lt;br /&gt;
# [[FPGA - Introducere]].&lt;br /&gt;
# [https://www.realdigital.org/doc/02013cd17602c8af749f00561f88ae21 Boolean Board - user manual]&lt;br /&gt;
# [[Boolean Board - Pinout]].&lt;br /&gt;
# [https://www.tulembedded.com/FPGA/ProductsPYNQ-Z2.html Pynq-Z2 - pagina oficiala]&lt;br /&gt;
# [https://dpoauwgwqsy2x.cloudfront.net/Download/pynqz2_user_manual_v1_0.pdf Pynq-Z2 - user manual]&lt;br /&gt;
# [[Pynq-Z2 - Pinout]].&lt;br /&gt;
	&lt;br /&gt;
O lista de link-uri utile poate fi gasita aici:&lt;br /&gt;
# [[Introducere. Verilog HDL]] (Sintaxa [[Verilog]])&lt;br /&gt;
# [https://www.asic-world.com/digital/index.html Asic-world - digital]&lt;br /&gt;
# [https://www.asic-world.com/verilog/index.html Asic-world - verilog]&lt;br /&gt;
# [https://nandgame.com/ Joc online: Nandgame]	&lt;br /&gt;
# [https://circuitverse.org/simulator Simulator/joc online si grafic de circuite: Circuitverse]	&lt;br /&gt;
# [https://falstad.com/circuit/ Simulator online si grafic de circuite (analog+digital): Falstad]&lt;br /&gt;
# [https://github.com/hneemann/Digital Simulator grafic de circuite digitale: hneemann-digital]&lt;br /&gt;
# [https://play.google.com/store/apps/details?id=com.ViacheslavRud.Circuit&amp;amp;hl=en_US&amp;amp;gl=US Joc android - Make it True: Solve the Circuit]&lt;br /&gt;
# [https://www.edaplayground.com/ Simulatoare online (mod text): Edaplayground]&lt;br /&gt;
# [https://wavedrom.com/ Utilitar desenare forme de unda]&lt;br /&gt;
# [https://www.draw.io/ Utilitar desenare diagrame]&lt;br /&gt;
# [[Domenii conexe]]&lt;br /&gt;
&lt;br /&gt;
== Lucrări de laborator ==&lt;br /&gt;
&lt;br /&gt;
# [[CID_aplicatii_1 : Generare de forme de unda]]&lt;br /&gt;
# [[CID_aplicatii_2 : Instantiere si porti logice]]&lt;br /&gt;
# [[CID_aplicatii_3 : Circuite combinationale elementare]]&lt;br /&gt;
# [[CID_aplicatii_4 : Alte circuite combinationale]]&lt;br /&gt;
# [[CID_aplicatii_5 : Exercitii cu circuite combinationale]]&lt;br /&gt;
# CID_aplicatii_6 : Lucrarea 1 - circuite combinationale&lt;br /&gt;
# [[CID_aplicatii_7 : Circuite secventiale elementare]]&lt;br /&gt;
# [[CID_aplicatii_8 : Registre si memorii RAM]]&lt;br /&gt;
# [[CID_aplicatii_9 : Numaratorul]]&lt;br /&gt;
# [[CID_aplicatii_10 : Aplicatii cu numaratoare]]&lt;br /&gt;
# [[CID_aplicatii_11 : Automate finite]]&lt;br /&gt;
# [[CID_aplicatii_12 : Exercitii cu circuite secventiale]]&lt;br /&gt;
# CID_aplicatii_13 : Lucrarea 2 - circuite secventiale&lt;br /&gt;
# [[CID_aplicatii_14 : Circuite digitale complexe]]&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_11_:_Automate_finite&amp;diff=7401</id>
		<title>CID aplicatii 11 : Automate finite</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_11_:_Automate_finite&amp;diff=7401"/>
		<updated>2022-05-29T11:02:09Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Exemple */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Automate finite ==&lt;br /&gt;
&lt;br /&gt;
Automatul finit este folosit pentru a descrie sisteme ce tranziteaza un numar finit de stari. Acest tip de sistem este foarte util atunci cand starile nu sunt tranzitate intr-un mod simplu, evident sau repetitiv. &lt;br /&gt;
&lt;br /&gt;
Automatul finit, numit și FSM (Finite State Machine), este un model matematic de computație, definit de următoarele elemente:&lt;br /&gt;
* O mulțime finită de simboluri de intrare, numită alfabet de intrare;&lt;br /&gt;
* O mulțime finită și nevidă de simboluri de ieșire, numită alfabet de ieșire;&lt;br /&gt;
* O mulțime finită și nevidă de stări, din care doar una, numită starea curentă, este activă la un moment dat;&lt;br /&gt;
* O stare inițială, care face parte din mulțimea stărilor;&lt;br /&gt;
* O funcție de tranziție a stărilor, care calculează starea următoare a automatului în funcție de starea curentă și de simbolul de intrare;&lt;br /&gt;
* O funcție de calcul a ieșirii, care determină simbolul de ieșire în funcție de starea curentă (în cazul automatelor de tip Moore) sau în funcție de starea curentă și de simbolul de intrare (în cazul automatelor de tip Mealy).&lt;br /&gt;
&lt;br /&gt;
[[[[Fișier:Fsm.png]]]]&lt;br /&gt;
&lt;br /&gt;
La fiecare front al ceasului, valoarea stării următoare, calculată de către CLC, va fi încărcată în registru. Dacă registrul are n biți, numărul maxim de stări care pot fi reprezentate este 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Acest număr poate fi mai mic, în funcție de schema de codare a stărilor. De exemplu, pentru n = 4, folosind codarea binară se pot reprezenta cel mult 16 stări (0000, 0001, 0010, ..., 1111), în timp ce pentru codarea one-hot, în care doar un singur bit poate lua valoarea 1, se pot reprezenta 4 stări (1000, 0100, 0010, 0001).&lt;br /&gt;
&lt;br /&gt;
Pentru a reprezenta comportamentul unui automat finit, putem folosi grafuri sau organigrame, conventiile de notare depinzand de tipul automatului (Moore sau Mealy).&lt;br /&gt;
&lt;br /&gt;
== Exemple == &lt;br /&gt;
=== Exemplul 1: Automat ce detecteaza secvente de tipul 11....100....0===&lt;br /&gt;
In acest exemplu va fi implementat un automat care detecteaza secventele de tipul 11....100....0. Pentru aceasta, automatul va avea o intrare pe un bit (&amp;#039;&amp;#039;in&amp;#039;&amp;#039;, pe care va veni secventa de biti) si doua iesiri: &amp;#039;&amp;#039;detectOk&amp;#039;&amp;#039;, care semnalizeaza prin 1 ca nu a fost inca detectata o secventa ilegala si &amp;#039;&amp;#039;detectFail&amp;#039;&amp;#039;, care semnalizeaza prin 1 ca a fost detectata o secventa ilegala (un 1 dupa 0). &lt;br /&gt;
&lt;br /&gt;
Automatul va avea 3 stari: &lt;br /&gt;
* Q0 - STATE_READ1: automatul intra in aceasta stare la reset si va ramane in aceasta atata timp cat intrarea este 1 (inca nu a aparut niciun 0).&lt;br /&gt;
* Q1 - STATE_READ0: automatul intra in aceasta stare atunci cand apare pe intrare primul 0 si va ramane in aceasta atata timp cat pe intrare este 0.&lt;br /&gt;
* Q2 - STATE_ERROR: automatul intra in aceasta stare atunci cand apare un 1 dupa 0 si va ramane blocat aici pana la reset.&lt;br /&gt;
&lt;br /&gt;
Pentru a coda cele 3 stari avem nevoie de minim 2 biti: STATE_READ1 = 2&amp;#039;b00, STATE_READ0 = 2&amp;#039;b01, STATE_ERROR = 2&amp;#039;b10.&lt;br /&gt;
&lt;br /&gt;
Graful automatului este:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Organigrama FSM 111000.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea automatului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module FSM1(&lt;br /&gt;
    input clock,&lt;br /&gt;
    input in,&lt;br /&gt;
    input reset,&lt;br /&gt;
    output detectOk,&lt;br /&gt;
    output detectFail&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//Se asociaza sirurilor de biti folositi pentru codarea starilor nume ce pot fi folosite mai usor in cod.&lt;br /&gt;
//La compilare, numele vor fi inlocuite in cod cu numerele asociate la inceput.&lt;br /&gt;
localparam STATE_READ1 = 2&amp;#039;b00;&lt;br /&gt;
localparam STATE_READ0 = 2&amp;#039;b01;&lt;br /&gt;
localparam STATE_ERROR = 2&amp;#039;b10;&lt;br /&gt;
&lt;br /&gt;
reg [1:0] state, state_next;&lt;br /&gt;
&lt;br /&gt;
//registrul de stare&lt;br /&gt;
always@(posedge clock) begin&lt;br /&gt;
    if(reset == 1)&lt;br /&gt;
        state &amp;lt;= STATE_READ1;&lt;br /&gt;
    else&lt;br /&gt;
        state &amp;lt;= state_next;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
//circuit combinational pentru calculul starii urmatoare&lt;br /&gt;
always@(*) begin&lt;br /&gt;
    state_next = state;&lt;br /&gt;
    case(state)&lt;br /&gt;
        STATE_READ1: begin&lt;br /&gt;
                         if(in == 0) state_next = STATE_READ0;&lt;br /&gt;
                     end&lt;br /&gt;
        STATE_READ0: begin&lt;br /&gt;
                         if(in == 1) state_next = STATE_ERROR;&lt;br /&gt;
                     end&lt;br /&gt;
        STATE_ERROR: state_next = STATE_ERROR;&lt;br /&gt;
        default: state_next = STATE_READ1;&lt;br /&gt;
	&lt;br /&gt;
    endcase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//circuit combinational pentru calculul iesirilor&lt;br /&gt;
assign detectOk   = (state == STATE_READ0) || (state == STATE_READ1);&lt;br /&gt;
assign detectFail = (state == STATE_ERROR);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea unui modul de test pentru FSM1&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module FSM1_TB();&lt;br /&gt;
&lt;br /&gt;
reg  clock_t;&lt;br /&gt;
reg  reset_t;&lt;br /&gt;
reg  in_t;&lt;br /&gt;
wire detectOk_t;&lt;br /&gt;
wire detectFail_t;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock_t = 0;&lt;br /&gt;
    forever #1 clock_t = ~clock_t;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
        in_t = 1;&lt;br /&gt;
        reset_t = 1;&lt;br /&gt;
    #2  reset_t = 0;&lt;br /&gt;
    #10 in_t = 0;&lt;br /&gt;
    #10 in_t = 1;&lt;br /&gt;
    #10 $stop();&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
FSM1 DUT(&lt;br /&gt;
    .clock(clock_t),&lt;br /&gt;
    .reset(reset_t),&lt;br /&gt;
    .in(in_t),&lt;br /&gt;
    .detectOk(detectOk_t),&lt;br /&gt;
    .detectFail(detectFail_t)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2: Automat ce detecteaza fronturile crescatoare ale unui semnal===&lt;br /&gt;
Automatul ce detecteaza fronturile crescatoare are un singur semnal de intrare &amp;#039;&amp;#039;in&amp;#039;&amp;#039;, care reprezinta semnalul analizat si o singura iesire, &amp;#039;&amp;#039;out&amp;#039;&amp;#039;, generand pe aceasta un puls lung cat o perioada de ceas la fiecare aparitie a unui front crescator pe &amp;#039;&amp;#039;in&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Vom avea nevoie de 3 stari:&lt;br /&gt;
* Q0: automatul intra in aceasta stare la reset si va ramane in aceasta atata timp cat intrarea este 0 (inca nu a aparut niciun front crescator).&lt;br /&gt;
* Q1: automatul intra in aceasta stare atunci cand apare pe intrare un front crescator. Dupa aparitia frontului crescator sunt doua posibilitati: linia ramane in 1, ceea ce duce la trecerea in starea Q2 care va duce iesirea in 0 dupa o perioada de ceas, sau linia trece in 0 dupa un ciclu de ceas, ceea ce duce la revenirea in starea Q0.&lt;br /&gt;
* Q2: automatul intra in aceasta stare atunci cand linia de intrare ramane in 1 mai mult de o perioada de ceas. Automatul va ramane in aceasta stare atata timp cat &amp;#039;&amp;#039;in&amp;#039;&amp;#039; ramane in 1 si va reveni in starea Q0 imediat ce &amp;#039;&amp;#039;in&amp;#039;&amp;#039; revine in 0.&lt;br /&gt;
&lt;br /&gt;
Graful automatului este:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Organigrama FSM rising edge.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea automatului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module FSM2(&lt;br /&gt;
    input clock,&lt;br /&gt;
    input in,&lt;br /&gt;
    input reset,&lt;br /&gt;
    output out&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
localparam Q0 = 2&amp;#039;b00;&lt;br /&gt;
localparam Q1 = 2&amp;#039;b01;&lt;br /&gt;
localparam Q2 = 2&amp;#039;b10;&lt;br /&gt;
&lt;br /&gt;
reg [1:0] state, state_next;&lt;br /&gt;
&lt;br /&gt;
always@(posedge clock) begin&lt;br /&gt;
    if(reset == 1)&lt;br /&gt;
        state &amp;lt;= Q0;&lt;br /&gt;
    else&lt;br /&gt;
        state &amp;lt;= state_next;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
always@(*) begin&lt;br /&gt;
    state_next = state;&lt;br /&gt;
    case(state)&lt;br /&gt;
        Q0: begin&lt;br /&gt;
                if(in == 1) state_next = Q1;&lt;br /&gt;
            end&lt;br /&gt;
        Q1: begin&lt;br /&gt;
                if(in == 0) state_next = Q0;&lt;br /&gt;
                if(in == 1) state_next = Q2;&lt;br /&gt;
            end&lt;br /&gt;
        Q2: begin&lt;br /&gt;
                if(in == 0) state_next = Q0;&lt;br /&gt;
            end&lt;br /&gt;
        default: state_next = Q0;&lt;br /&gt;
	endcase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
assign out   = (state == Q1);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea unui modul de test pentru FSM2&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module FSM2_TB();&lt;br /&gt;
&lt;br /&gt;
reg  clock_t;&lt;br /&gt;
reg  reset_t;&lt;br /&gt;
reg  in_t;&lt;br /&gt;
wire out_t;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock_t = 0;&lt;br /&gt;
    forever #1 clock_t = ~clock_t;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
        in_t = 0;&lt;br /&gt;
        reset_t = 1;&lt;br /&gt;
    #2  reset_t = 0;&lt;br /&gt;
    #10 in_t = 1;&lt;br /&gt;
    #5	in_t = 0;&lt;br /&gt;
    #10 in_t = 1;&lt;br /&gt;
    #5	in_t = 0;&lt;br /&gt;
    #10 $stop();&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
FSM2 DUT(&lt;br /&gt;
    .clock(clock_t),&lt;br /&gt;
    .reset(reset_t),&lt;br /&gt;
    .in(in_t),&lt;br /&gt;
    .out(out_t)&lt;br /&gt;
);&lt;br /&gt;
   &lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exerciții==&lt;br /&gt;
=== Exercițiul 1 ===&lt;br /&gt;
Implementați un automat finit ce detectează fronturile descrescătoare. Acesta are un singur semnal de intrare &amp;#039;&amp;#039;in&amp;#039;&amp;#039;, care reprezintă semnalul analizat și o singură ieșire &amp;#039;&amp;#039;out&amp;#039;&amp;#039;, generând pe această un puls lung cât o perioadă de ceas la fiecare apariție a unui front descrescător pe &amp;#039;&amp;#039;in&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Realizați implementarea Verilog plecând de la graful automatului:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Graf FSM falling edge.png]]&lt;br /&gt;
&lt;br /&gt;
=== Exercițiul 2 ===&lt;br /&gt;
Implementați un automat finit ce detectează atât fronturile crescătoare, cât și pe cele descrescătoare.&lt;br /&gt;
&lt;br /&gt;
=== Exercițiul 3 ===&lt;br /&gt;
Să se implementeze un circuit care generează un semnal PWM cu un factor de umplere ce variază triungular, la fiecare front descrescător al unui semnal de intrare.&lt;br /&gt;
&lt;br /&gt;
Schema circuitului este:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:FSM Exercitiu.png]]&lt;br /&gt;
&lt;br /&gt;
Modulele componente ale circuitului sunt:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FallingEdgeDetector&amp;#039;&amp;#039;&amp;#039;: Automat ce detectează fronturile descrescătoare ale semnalului de intrare.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;TriangularCounter&amp;#039;&amp;#039;&amp;#039;: Automat ce generează la iesire secvența de numere 64, 128, 192, 255, 192, 128, 64.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Counter&amp;#039;&amp;#039;&amp;#039;: Numărător pe 8 biți cu reset sincron.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;COMP&amp;#039;&amp;#039;&amp;#039;: Comparator cu două intrări pe 8 biți. Ieșirea sa va fi 1 atunci când counter &amp;lt; out și 0 în rest.&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_11_:_Automate_finite&amp;diff=7400</id>
		<title>CID aplicatii 11 : Automate finite</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_11_:_Automate_finite&amp;diff=7400"/>
		<updated>2022-05-29T07:18:56Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Exercițiul 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Automate finite ==&lt;br /&gt;
&lt;br /&gt;
Automatul finit este folosit pentru a descrie sisteme ce tranziteaza un numar finit de stari. Acest tip de sistem este foarte util atunci cand starile nu sunt tranzitate intr-un mod simplu, evident sau repetitiv. &lt;br /&gt;
&lt;br /&gt;
Automatul finit, numit și FSM (Finite State Machine), este un model matematic de computație, definit de următoarele elemente:&lt;br /&gt;
* O mulțime finită de simboluri de intrare, numită alfabet de intrare;&lt;br /&gt;
* O mulțime finită și nevidă de simboluri de ieșire, numită alfabet de ieșire;&lt;br /&gt;
* O mulțime finită și nevidă de stări, din care doar una, numită starea curentă, este activă la un moment dat;&lt;br /&gt;
* O stare inițială, care face parte din mulțimea stărilor;&lt;br /&gt;
* O funcție de tranziție a stărilor, care calculează starea următoare a automatului în funcție de starea curentă și de simbolul de intrare;&lt;br /&gt;
* O funcție de calcul a ieșirii, care determină simbolul de ieșire în funcție de starea curentă (în cazul automatelor de tip Moore) sau în funcție de starea curentă și de simbolul de intrare (în cazul automatelor de tip Mealy).&lt;br /&gt;
&lt;br /&gt;
[[[[Fișier:Fsm.png]]]]&lt;br /&gt;
&lt;br /&gt;
La fiecare front al ceasului, valoarea stării următoare, calculată de către CLC, va fi încărcată în registru. Dacă registrul are n biți, numărul maxim de stări care pot fi reprezentate este 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Acest număr poate fi mai mic, în funcție de schema de codare a stărilor. De exemplu, pentru n = 4, folosind codarea binară se pot reprezenta cel mult 16 stări (0000, 0001, 0010, ..., 1111), în timp ce pentru codarea one-hot, în care doar un singur bit poate lua valoarea 1, se pot reprezenta 4 stări (1000, 0100, 0010, 0001).&lt;br /&gt;
&lt;br /&gt;
Pentru a reprezenta comportamentul unui automat finit, putem folosi grafuri sau organigrame, conventiile de notare depinzand de tipul automatului (Moore sau Mealy).&lt;br /&gt;
&lt;br /&gt;
== Exemple == &lt;br /&gt;
=== Exemplul 1: Automat ce detecteaza secvente de tipul 11....100....0===&lt;br /&gt;
In acest exemplu va fi implementat un automat care detecteaza secventele de tipul 11....100....0. Pentru aceasta, automatul va avea o intrare pe un bit (&amp;#039;&amp;#039;in&amp;#039;&amp;#039;, pe care va veni secventa de biti) si doua iesiri: &amp;#039;&amp;#039;detectOk&amp;#039;&amp;#039;, care semnalizeaza prin 1 ca nu a fost inca detectata o secventa ilegala si &amp;#039;&amp;#039;detectFail&amp;#039;&amp;#039;, care semnalizeaza prin 1 ca a fost detectata o secventa ilegala (un 1 dupa 0). &lt;br /&gt;
&lt;br /&gt;
Automatul va avea 3 stari: &lt;br /&gt;
* Q0 - STATE_READ1: automatul intra in aceasta stare la reset si va ramane in aceasta atata timp cat intrarea este 1 (inca nu a aparut niciun 0).&lt;br /&gt;
* Q1 - STATE_READ0: automatul intra in aceasta stare atunci cand apare pe intrare primul 0 si va ramane in aceasta atata timp cat pe intrare este 0.&lt;br /&gt;
* Q2 - STATE_ERROR: automatul intra in aceasta stare atunci cand apare un 1 dupa 0 si va ramane blocat aici pana la reset.&lt;br /&gt;
&lt;br /&gt;
Pentru a coda cele 3 stari avem nevoie de minim 2 biti: STATE_READ1 = 2&amp;#039;b00, STATE_READ0 = 2&amp;#039;b01, STATE_ERROR = 2&amp;#039;b10.&lt;br /&gt;
&lt;br /&gt;
Graful automatului este:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Organigrama FSM 111000.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea automatului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module FSM1(&lt;br /&gt;
    input clock,&lt;br /&gt;
    input in,&lt;br /&gt;
    input reset,&lt;br /&gt;
    output detectOk,&lt;br /&gt;
    output detectFail&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//Se asociaza sirurilor de biti folositi pentru codarea starilor nume ce pot fi folosite mai usor in cod.&lt;br /&gt;
//La compilare, numele vor fi inlocuite in cod cu numerele asociate la inceput.&lt;br /&gt;
localparam STATE_READ1 = 2&amp;#039;b00;&lt;br /&gt;
localparam STATE_READ0 = 2&amp;#039;b01;&lt;br /&gt;
localparam STATE_ERROR = 2&amp;#039;b10;&lt;br /&gt;
&lt;br /&gt;
reg [1:0] state, state_next;&lt;br /&gt;
&lt;br /&gt;
//registrul de stare&lt;br /&gt;
always@(posedge clock) begin&lt;br /&gt;
    if(reset == 0)&lt;br /&gt;
        state &amp;lt;= STATE_READ1;&lt;br /&gt;
    else&lt;br /&gt;
        state &amp;lt;= state_next;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
//circuit combinational pentru calculul starii urmatoare&lt;br /&gt;
always@(*) begin&lt;br /&gt;
    state_next = state;&lt;br /&gt;
    case(state)&lt;br /&gt;
        STATE_READ1: begin&lt;br /&gt;
                         if(in == 0) state_next = STATE_READ0;&lt;br /&gt;
                     end&lt;br /&gt;
        STATE_READ0: begin&lt;br /&gt;
                         if(in == 1) state_next = STATE_ERROR;&lt;br /&gt;
                     end&lt;br /&gt;
        STATE_ERROR: state_next = STATE_ERROR;&lt;br /&gt;
        default: state_next = STATE_READ1;&lt;br /&gt;
	&lt;br /&gt;
    endcase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//circuit combinational pentru calculul iesirilor&lt;br /&gt;
assign detectOk   = (state == STATE_READ0) || (state == STATE_READ1);&lt;br /&gt;
assign detectFail = (state == STATE_ERROR);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea unui modul de test pentru FSM1&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module FSM1_TB();&lt;br /&gt;
&lt;br /&gt;
reg  clock_t;&lt;br /&gt;
reg  reset_t;&lt;br /&gt;
reg  in_t;&lt;br /&gt;
wire detectOk_t;&lt;br /&gt;
wire detectFail_t;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock_t = 0;&lt;br /&gt;
    forever #1 clock_t = ~clock_t;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
        in_t = 1;&lt;br /&gt;
        reset_t = 0;&lt;br /&gt;
    #2  reset_t = 1;&lt;br /&gt;
    #10 in_t = 0;&lt;br /&gt;
    #10 in_t = 1;&lt;br /&gt;
    #10 $stop();&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
FSM1 DUT(&lt;br /&gt;
    .clock(clock_t),&lt;br /&gt;
    .reset(reset_t),&lt;br /&gt;
    .in(in_t),&lt;br /&gt;
    .detectOk(detectOk_t),&lt;br /&gt;
    .detectFail(detectFail_t)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2: Automat ce detecteaza fronturile crescatoare ale unui semnal===&lt;br /&gt;
Automatul ce detecteaza fronturile crescatoare are un singur semnal de intrare &amp;#039;&amp;#039;in&amp;#039;&amp;#039;, care reprezinta semnalul analizat si o singura iesire, &amp;#039;&amp;#039;out&amp;#039;&amp;#039;, generand pe aceasta un puls lung cat o perioada de ceas la fiecare aparitie a unui front crescator pe &amp;#039;&amp;#039;in&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Vom avea nevoie de 3 stari:&lt;br /&gt;
* Q0: automatul intra in aceasta stare la reset si va ramane in aceasta atata timp cat intrarea este 0 (inca nu a aparut niciun front crescator).&lt;br /&gt;
* Q1: automatul intra in aceasta stare atunci cand apare pe intrare un front crescator. Dupa aparitia frontului crescator sunt doua posibilitati: linia ramane in 1, ceea ce duce la trecerea in starea Q2 care va duce iesirea in 0 dupa o perioada de ceas, sau linia trece in 0 dupa un ciclu de ceas, ceea ce duce la revenirea in starea Q0.&lt;br /&gt;
* Q2: automatul intra in aceasta stare atunci cand linia de intrare ramane in 1 mai mult de o perioada de ceas. Automatul va ramane in aceasta stare atata timp cat &amp;#039;&amp;#039;in&amp;#039;&amp;#039; ramane in 1 si va reveni in starea Q0 imediat ce &amp;#039;&amp;#039;in&amp;#039;&amp;#039; revine in 0.&lt;br /&gt;
&lt;br /&gt;
Graful automatului este:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Organigrama FSM rising edge.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea automatului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module FSM2(&lt;br /&gt;
    input clock,&lt;br /&gt;
    input in,&lt;br /&gt;
    input reset,&lt;br /&gt;
    output out&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
localparam Q0 = 2&amp;#039;b00;&lt;br /&gt;
localparam Q1 = 2&amp;#039;b01;&lt;br /&gt;
localparam Q2 = 2&amp;#039;b10;&lt;br /&gt;
&lt;br /&gt;
reg [1:0] state, state_next;&lt;br /&gt;
&lt;br /&gt;
always@(posedge clock) begin&lt;br /&gt;
    if(reset == 0)&lt;br /&gt;
        state &amp;lt;= Q0;&lt;br /&gt;
    else&lt;br /&gt;
        state &amp;lt;= state_next;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
always@(*) begin&lt;br /&gt;
    state_next = state;&lt;br /&gt;
    case(state)&lt;br /&gt;
        Q0: begin&lt;br /&gt;
                if(in == 1) state_next = Q1;&lt;br /&gt;
            end&lt;br /&gt;
        Q1: begin&lt;br /&gt;
                if(in == 0) state_next = Q0;&lt;br /&gt;
                if(in == 1) state_next = Q2;&lt;br /&gt;
            end&lt;br /&gt;
        Q2: begin&lt;br /&gt;
                if(in == 0) state_next = Q0;&lt;br /&gt;
            end&lt;br /&gt;
        default: state_next = Q0;&lt;br /&gt;
	endcase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
assign out   = (state == Q1);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea unui modul de test pentru FSM2&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module FSM2_TB();&lt;br /&gt;
&lt;br /&gt;
reg  clock_t;&lt;br /&gt;
reg  reset_t;&lt;br /&gt;
reg  in_t;&lt;br /&gt;
wire out_t;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock_t = 0;&lt;br /&gt;
    forever #1 clock_t = ~clock_t;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
        in_t = 0;&lt;br /&gt;
        reset_t = 0;&lt;br /&gt;
    #2  reset_t = 1;&lt;br /&gt;
    #10 in_t = 1;&lt;br /&gt;
    #5	in_t = 0;&lt;br /&gt;
    #10 in_t = 1;&lt;br /&gt;
    #5	in_t = 0;&lt;br /&gt;
    #10 $stop();&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
FSM2 DUT(&lt;br /&gt;
    .clock(clock_t),&lt;br /&gt;
    .reset(reset_t),&lt;br /&gt;
    .in(in_t),&lt;br /&gt;
    .out(out_t)&lt;br /&gt;
);&lt;br /&gt;
   &lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exerciții==&lt;br /&gt;
=== Exercițiul 1 ===&lt;br /&gt;
Implementați un automat finit ce detectează fronturile descrescătoare. Acesta are un singur semnal de intrare &amp;#039;&amp;#039;in&amp;#039;&amp;#039;, care reprezintă semnalul analizat și o singură ieșire &amp;#039;&amp;#039;out&amp;#039;&amp;#039;, generând pe această un puls lung cât o perioadă de ceas la fiecare apariție a unui front descrescător pe &amp;#039;&amp;#039;in&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Realizați implementarea Verilog plecând de la graful automatului:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Graf FSM falling edge.png]]&lt;br /&gt;
&lt;br /&gt;
=== Exercițiul 2 ===&lt;br /&gt;
Implementați un automat finit ce detectează atât fronturile crescătoare, cât și pe cele descrescătoare.&lt;br /&gt;
&lt;br /&gt;
=== Exercițiul 3 ===&lt;br /&gt;
Să se implementeze un circuit care generează un semnal PWM cu un factor de umplere ce variază triungular, la fiecare front descrescător al unui semnal de intrare.&lt;br /&gt;
&lt;br /&gt;
Schema circuitului este:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:FSM Exercitiu.png]]&lt;br /&gt;
&lt;br /&gt;
Modulele componente ale circuitului sunt:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FallingEdgeDetector&amp;#039;&amp;#039;&amp;#039;: Automat ce detectează fronturile descrescătoare ale semnalului de intrare.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;TriangularCounter&amp;#039;&amp;#039;&amp;#039;: Automat ce generează la iesire secvența de numere 64, 128, 192, 255, 192, 128, 64.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Counter&amp;#039;&amp;#039;&amp;#039;: Numărător pe 8 biți cu reset sincron.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;COMP&amp;#039;&amp;#039;&amp;#039;: Comparator cu două intrări pe 8 biți. Ieșirea sa va fi 1 atunci când counter &amp;lt; out și 0 în rest.&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_11_:_Automate_finite&amp;diff=7399</id>
		<title>CID aplicatii 11 : Automate finite</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_11_:_Automate_finite&amp;diff=7399"/>
		<updated>2022-05-29T07:17:46Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Exerciții */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Automate finite ==&lt;br /&gt;
&lt;br /&gt;
Automatul finit este folosit pentru a descrie sisteme ce tranziteaza un numar finit de stari. Acest tip de sistem este foarte util atunci cand starile nu sunt tranzitate intr-un mod simplu, evident sau repetitiv. &lt;br /&gt;
&lt;br /&gt;
Automatul finit, numit și FSM (Finite State Machine), este un model matematic de computație, definit de următoarele elemente:&lt;br /&gt;
* O mulțime finită de simboluri de intrare, numită alfabet de intrare;&lt;br /&gt;
* O mulțime finită și nevidă de simboluri de ieșire, numită alfabet de ieșire;&lt;br /&gt;
* O mulțime finită și nevidă de stări, din care doar una, numită starea curentă, este activă la un moment dat;&lt;br /&gt;
* O stare inițială, care face parte din mulțimea stărilor;&lt;br /&gt;
* O funcție de tranziție a stărilor, care calculează starea următoare a automatului în funcție de starea curentă și de simbolul de intrare;&lt;br /&gt;
* O funcție de calcul a ieșirii, care determină simbolul de ieșire în funcție de starea curentă (în cazul automatelor de tip Moore) sau în funcție de starea curentă și de simbolul de intrare (în cazul automatelor de tip Mealy).&lt;br /&gt;
&lt;br /&gt;
[[[[Fișier:Fsm.png]]]]&lt;br /&gt;
&lt;br /&gt;
La fiecare front al ceasului, valoarea stării următoare, calculată de către CLC, va fi încărcată în registru. Dacă registrul are n biți, numărul maxim de stări care pot fi reprezentate este 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Acest număr poate fi mai mic, în funcție de schema de codare a stărilor. De exemplu, pentru n = 4, folosind codarea binară se pot reprezenta cel mult 16 stări (0000, 0001, 0010, ..., 1111), în timp ce pentru codarea one-hot, în care doar un singur bit poate lua valoarea 1, se pot reprezenta 4 stări (1000, 0100, 0010, 0001).&lt;br /&gt;
&lt;br /&gt;
Pentru a reprezenta comportamentul unui automat finit, putem folosi grafuri sau organigrame, conventiile de notare depinzand de tipul automatului (Moore sau Mealy).&lt;br /&gt;
&lt;br /&gt;
== Exemple == &lt;br /&gt;
=== Exemplul 1: Automat ce detecteaza secvente de tipul 11....100....0===&lt;br /&gt;
In acest exemplu va fi implementat un automat care detecteaza secventele de tipul 11....100....0. Pentru aceasta, automatul va avea o intrare pe un bit (&amp;#039;&amp;#039;in&amp;#039;&amp;#039;, pe care va veni secventa de biti) si doua iesiri: &amp;#039;&amp;#039;detectOk&amp;#039;&amp;#039;, care semnalizeaza prin 1 ca nu a fost inca detectata o secventa ilegala si &amp;#039;&amp;#039;detectFail&amp;#039;&amp;#039;, care semnalizeaza prin 1 ca a fost detectata o secventa ilegala (un 1 dupa 0). &lt;br /&gt;
&lt;br /&gt;
Automatul va avea 3 stari: &lt;br /&gt;
* Q0 - STATE_READ1: automatul intra in aceasta stare la reset si va ramane in aceasta atata timp cat intrarea este 1 (inca nu a aparut niciun 0).&lt;br /&gt;
* Q1 - STATE_READ0: automatul intra in aceasta stare atunci cand apare pe intrare primul 0 si va ramane in aceasta atata timp cat pe intrare este 0.&lt;br /&gt;
* Q2 - STATE_ERROR: automatul intra in aceasta stare atunci cand apare un 1 dupa 0 si va ramane blocat aici pana la reset.&lt;br /&gt;
&lt;br /&gt;
Pentru a coda cele 3 stari avem nevoie de minim 2 biti: STATE_READ1 = 2&amp;#039;b00, STATE_READ0 = 2&amp;#039;b01, STATE_ERROR = 2&amp;#039;b10.&lt;br /&gt;
&lt;br /&gt;
Graful automatului este:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Organigrama FSM 111000.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea automatului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module FSM1(&lt;br /&gt;
    input clock,&lt;br /&gt;
    input in,&lt;br /&gt;
    input reset,&lt;br /&gt;
    output detectOk,&lt;br /&gt;
    output detectFail&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//Se asociaza sirurilor de biti folositi pentru codarea starilor nume ce pot fi folosite mai usor in cod.&lt;br /&gt;
//La compilare, numele vor fi inlocuite in cod cu numerele asociate la inceput.&lt;br /&gt;
localparam STATE_READ1 = 2&amp;#039;b00;&lt;br /&gt;
localparam STATE_READ0 = 2&amp;#039;b01;&lt;br /&gt;
localparam STATE_ERROR = 2&amp;#039;b10;&lt;br /&gt;
&lt;br /&gt;
reg [1:0] state, state_next;&lt;br /&gt;
&lt;br /&gt;
//registrul de stare&lt;br /&gt;
always@(posedge clock) begin&lt;br /&gt;
    if(reset == 0)&lt;br /&gt;
        state &amp;lt;= STATE_READ1;&lt;br /&gt;
    else&lt;br /&gt;
        state &amp;lt;= state_next;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
//circuit combinational pentru calculul starii urmatoare&lt;br /&gt;
always@(*) begin&lt;br /&gt;
    state_next = state;&lt;br /&gt;
    case(state)&lt;br /&gt;
        STATE_READ1: begin&lt;br /&gt;
                         if(in == 0) state_next = STATE_READ0;&lt;br /&gt;
                     end&lt;br /&gt;
        STATE_READ0: begin&lt;br /&gt;
                         if(in == 1) state_next = STATE_ERROR;&lt;br /&gt;
                     end&lt;br /&gt;
        STATE_ERROR: state_next = STATE_ERROR;&lt;br /&gt;
        default: state_next = STATE_READ1;&lt;br /&gt;
	&lt;br /&gt;
    endcase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//circuit combinational pentru calculul iesirilor&lt;br /&gt;
assign detectOk   = (state == STATE_READ0) || (state == STATE_READ1);&lt;br /&gt;
assign detectFail = (state == STATE_ERROR);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea unui modul de test pentru FSM1&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module FSM1_TB();&lt;br /&gt;
&lt;br /&gt;
reg  clock_t;&lt;br /&gt;
reg  reset_t;&lt;br /&gt;
reg  in_t;&lt;br /&gt;
wire detectOk_t;&lt;br /&gt;
wire detectFail_t;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock_t = 0;&lt;br /&gt;
    forever #1 clock_t = ~clock_t;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
        in_t = 1;&lt;br /&gt;
        reset_t = 0;&lt;br /&gt;
    #2  reset_t = 1;&lt;br /&gt;
    #10 in_t = 0;&lt;br /&gt;
    #10 in_t = 1;&lt;br /&gt;
    #10 $stop();&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
FSM1 DUT(&lt;br /&gt;
    .clock(clock_t),&lt;br /&gt;
    .reset(reset_t),&lt;br /&gt;
    .in(in_t),&lt;br /&gt;
    .detectOk(detectOk_t),&lt;br /&gt;
    .detectFail(detectFail_t)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2: Automat ce detecteaza fronturile crescatoare ale unui semnal===&lt;br /&gt;
Automatul ce detecteaza fronturile crescatoare are un singur semnal de intrare &amp;#039;&amp;#039;in&amp;#039;&amp;#039;, care reprezinta semnalul analizat si o singura iesire, &amp;#039;&amp;#039;out&amp;#039;&amp;#039;, generand pe aceasta un puls lung cat o perioada de ceas la fiecare aparitie a unui front crescator pe &amp;#039;&amp;#039;in&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Vom avea nevoie de 3 stari:&lt;br /&gt;
* Q0: automatul intra in aceasta stare la reset si va ramane in aceasta atata timp cat intrarea este 0 (inca nu a aparut niciun front crescator).&lt;br /&gt;
* Q1: automatul intra in aceasta stare atunci cand apare pe intrare un front crescator. Dupa aparitia frontului crescator sunt doua posibilitati: linia ramane in 1, ceea ce duce la trecerea in starea Q2 care va duce iesirea in 0 dupa o perioada de ceas, sau linia trece in 0 dupa un ciclu de ceas, ceea ce duce la revenirea in starea Q0.&lt;br /&gt;
* Q2: automatul intra in aceasta stare atunci cand linia de intrare ramane in 1 mai mult de o perioada de ceas. Automatul va ramane in aceasta stare atata timp cat &amp;#039;&amp;#039;in&amp;#039;&amp;#039; ramane in 1 si va reveni in starea Q0 imediat ce &amp;#039;&amp;#039;in&amp;#039;&amp;#039; revine in 0.&lt;br /&gt;
&lt;br /&gt;
Graful automatului este:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Organigrama FSM rising edge.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea automatului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module FSM2(&lt;br /&gt;
    input clock,&lt;br /&gt;
    input in,&lt;br /&gt;
    input reset,&lt;br /&gt;
    output out&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
localparam Q0 = 2&amp;#039;b00;&lt;br /&gt;
localparam Q1 = 2&amp;#039;b01;&lt;br /&gt;
localparam Q2 = 2&amp;#039;b10;&lt;br /&gt;
&lt;br /&gt;
reg [1:0] state, state_next;&lt;br /&gt;
&lt;br /&gt;
always@(posedge clock) begin&lt;br /&gt;
    if(reset == 0)&lt;br /&gt;
        state &amp;lt;= Q0;&lt;br /&gt;
    else&lt;br /&gt;
        state &amp;lt;= state_next;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
always@(*) begin&lt;br /&gt;
    state_next = state;&lt;br /&gt;
    case(state)&lt;br /&gt;
        Q0: begin&lt;br /&gt;
                if(in == 1) state_next = Q1;&lt;br /&gt;
            end&lt;br /&gt;
        Q1: begin&lt;br /&gt;
                if(in == 0) state_next = Q0;&lt;br /&gt;
                if(in == 1) state_next = Q2;&lt;br /&gt;
            end&lt;br /&gt;
        Q2: begin&lt;br /&gt;
                if(in == 0) state_next = Q0;&lt;br /&gt;
            end&lt;br /&gt;
        default: state_next = Q0;&lt;br /&gt;
	endcase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
assign out   = (state == Q1);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea unui modul de test pentru FSM2&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module FSM2_TB();&lt;br /&gt;
&lt;br /&gt;
reg  clock_t;&lt;br /&gt;
reg  reset_t;&lt;br /&gt;
reg  in_t;&lt;br /&gt;
wire out_t;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock_t = 0;&lt;br /&gt;
    forever #1 clock_t = ~clock_t;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
        in_t = 0;&lt;br /&gt;
        reset_t = 0;&lt;br /&gt;
    #2  reset_t = 1;&lt;br /&gt;
    #10 in_t = 1;&lt;br /&gt;
    #5	in_t = 0;&lt;br /&gt;
    #10 in_t = 1;&lt;br /&gt;
    #5	in_t = 0;&lt;br /&gt;
    #10 $stop();&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
FSM2 DUT(&lt;br /&gt;
    .clock(clock_t),&lt;br /&gt;
    .reset(reset_t),&lt;br /&gt;
    .in(in_t),&lt;br /&gt;
    .out(out_t)&lt;br /&gt;
);&lt;br /&gt;
   &lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exerciții==&lt;br /&gt;
=== Exercițiul 1 ===&lt;br /&gt;
Implementați un automat finit ce detectează fronturile descrescătoare. Acesta are un singur semnal de intrare &amp;#039;&amp;#039;in&amp;#039;&amp;#039;, care reprezintă semnalul analizat și o singură ieșire &amp;#039;&amp;#039;out&amp;#039;&amp;#039;, generând pe această un puls lung cât o perioadă de ceas la fiecare apariție a unui front descrescător pe &amp;#039;&amp;#039;in&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Realizați implementarea Verilog plecând de la graful automatului:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Graf FSM falling edge.png]]&lt;br /&gt;
&lt;br /&gt;
=== Exercițiul 2 ===&lt;br /&gt;
Implementați un automat finit ce detectează atât fronturile crescătoare, cât și cele descrescătoare.&lt;br /&gt;
&lt;br /&gt;
=== Exercițiul 3 ===&lt;br /&gt;
Să se implementeze un circuit care generează un semnal PWM cu un factor de umplere ce variază triungular, la fiecare front descrescător al unui semnal de intrare.&lt;br /&gt;
&lt;br /&gt;
Schema circuitului este:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:FSM Exercitiu.png]]&lt;br /&gt;
&lt;br /&gt;
Modulele componente ale circuitului sunt:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;FallingEdgeDetector&amp;#039;&amp;#039;&amp;#039;: Automat ce detectează fronturile descrescătoare ale semnalului de intrare.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;TriangularCounter&amp;#039;&amp;#039;&amp;#039;: Automat ce generează la iesire secvența de numere 64, 128, 192, 255, 192, 128, 64.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Counter&amp;#039;&amp;#039;&amp;#039;: Numărător pe 8 biți cu reset sincron.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;COMP&amp;#039;&amp;#039;&amp;#039;: Comparator cu două intrări pe 8 biți. Ieșirea sa va fi 1 atunci când counter &amp;lt; out și 0 în rest.&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_11_:_Automate_finite&amp;diff=7398</id>
		<title>CID aplicatii 11 : Automate finite</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_11_:_Automate_finite&amp;diff=7398"/>
		<updated>2022-05-29T06:58:37Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: Exercițiul 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Automate finite ==&lt;br /&gt;
&lt;br /&gt;
Automatul finit este folosit pentru a descrie sisteme ce tranziteaza un numar finit de stari. Acest tip de sistem este foarte util atunci cand starile nu sunt tranzitate intr-un mod simplu, evident sau repetitiv. &lt;br /&gt;
&lt;br /&gt;
Automatul finit, numit și FSM (Finite State Machine), este un model matematic de computație, definit de următoarele elemente:&lt;br /&gt;
* O mulțime finită de simboluri de intrare, numită alfabet de intrare;&lt;br /&gt;
* O mulțime finită și nevidă de simboluri de ieșire, numită alfabet de ieșire;&lt;br /&gt;
* O mulțime finită și nevidă de stări, din care doar una, numită starea curentă, este activă la un moment dat;&lt;br /&gt;
* O stare inițială, care face parte din mulțimea stărilor;&lt;br /&gt;
* O funcție de tranziție a stărilor, care calculează starea următoare a automatului în funcție de starea curentă și de simbolul de intrare;&lt;br /&gt;
* O funcție de calcul a ieșirii, care determină simbolul de ieșire în funcție de starea curentă (în cazul automatelor de tip Moore) sau în funcție de starea curentă și de simbolul de intrare (în cazul automatelor de tip Mealy).&lt;br /&gt;
&lt;br /&gt;
[[[[Fișier:Fsm.png]]]]&lt;br /&gt;
&lt;br /&gt;
La fiecare front al ceasului, valoarea stării următoare, calculată de către CLC, va fi încărcată în registru. Dacă registrul are n biți, numărul maxim de stări care pot fi reprezentate este 2&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt;. Acest număr poate fi mai mic, în funcție de schema de codare a stărilor. De exemplu, pentru n = 4, folosind codarea binară se pot reprezenta cel mult 16 stări (0000, 0001, 0010, ..., 1111), în timp ce pentru codarea one-hot, în care doar un singur bit poate lua valoarea 1, se pot reprezenta 4 stări (1000, 0100, 0010, 0001).&lt;br /&gt;
&lt;br /&gt;
Pentru a reprezenta comportamentul unui automat finit, putem folosi grafuri sau organigrame, conventiile de notare depinzand de tipul automatului (Moore sau Mealy).&lt;br /&gt;
&lt;br /&gt;
== Exemple == &lt;br /&gt;
=== Exemplul 1: Automat ce detecteaza secvente de tipul 11....100....0===&lt;br /&gt;
In acest exemplu va fi implementat un automat care detecteaza secventele de tipul 11....100....0. Pentru aceasta, automatul va avea o intrare pe un bit (&amp;#039;&amp;#039;in&amp;#039;&amp;#039;, pe care va veni secventa de biti) si doua iesiri: &amp;#039;&amp;#039;detectOk&amp;#039;&amp;#039;, care semnalizeaza prin 1 ca nu a fost inca detectata o secventa ilegala si &amp;#039;&amp;#039;detectFail&amp;#039;&amp;#039;, care semnalizeaza prin 1 ca a fost detectata o secventa ilegala (un 1 dupa 0). &lt;br /&gt;
&lt;br /&gt;
Automatul va avea 3 stari: &lt;br /&gt;
* Q0 - STATE_READ1: automatul intra in aceasta stare la reset si va ramane in aceasta atata timp cat intrarea este 1 (inca nu a aparut niciun 0).&lt;br /&gt;
* Q1 - STATE_READ0: automatul intra in aceasta stare atunci cand apare pe intrare primul 0 si va ramane in aceasta atata timp cat pe intrare este 0.&lt;br /&gt;
* Q2 - STATE_ERROR: automatul intra in aceasta stare atunci cand apare un 1 dupa 0 si va ramane blocat aici pana la reset.&lt;br /&gt;
&lt;br /&gt;
Pentru a coda cele 3 stari avem nevoie de minim 2 biti: STATE_READ1 = 2&amp;#039;b00, STATE_READ0 = 2&amp;#039;b01, STATE_ERROR = 2&amp;#039;b10.&lt;br /&gt;
&lt;br /&gt;
Graful automatului este:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Organigrama FSM 111000.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea automatului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module FSM1(&lt;br /&gt;
    input clock,&lt;br /&gt;
    input in,&lt;br /&gt;
    input reset,&lt;br /&gt;
    output detectOk,&lt;br /&gt;
    output detectFail&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
//Se asociaza sirurilor de biti folositi pentru codarea starilor nume ce pot fi folosite mai usor in cod.&lt;br /&gt;
//La compilare, numele vor fi inlocuite in cod cu numerele asociate la inceput.&lt;br /&gt;
localparam STATE_READ1 = 2&amp;#039;b00;&lt;br /&gt;
localparam STATE_READ0 = 2&amp;#039;b01;&lt;br /&gt;
localparam STATE_ERROR = 2&amp;#039;b10;&lt;br /&gt;
&lt;br /&gt;
reg [1:0] state, state_next;&lt;br /&gt;
&lt;br /&gt;
//registrul de stare&lt;br /&gt;
always@(posedge clock) begin&lt;br /&gt;
    if(reset == 0)&lt;br /&gt;
        state &amp;lt;= STATE_READ1;&lt;br /&gt;
    else&lt;br /&gt;
        state &amp;lt;= state_next;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
//circuit combinational pentru calculul starii urmatoare&lt;br /&gt;
always@(*) begin&lt;br /&gt;
    state_next = state;&lt;br /&gt;
    case(state)&lt;br /&gt;
        STATE_READ1: begin&lt;br /&gt;
                         if(in == 0) state_next = STATE_READ0;&lt;br /&gt;
                     end&lt;br /&gt;
        STATE_READ0: begin&lt;br /&gt;
                         if(in == 1) state_next = STATE_ERROR;&lt;br /&gt;
                     end&lt;br /&gt;
        STATE_ERROR: state_next = STATE_ERROR;&lt;br /&gt;
        default: state_next = STATE_READ1;&lt;br /&gt;
	&lt;br /&gt;
    endcase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//circuit combinational pentru calculul iesirilor&lt;br /&gt;
assign detectOk   = (state == STATE_READ0) || (state == STATE_READ1);&lt;br /&gt;
assign detectFail = (state == STATE_ERROR);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea unui modul de test pentru FSM1&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module FSM1_TB();&lt;br /&gt;
&lt;br /&gt;
reg  clock_t;&lt;br /&gt;
reg  reset_t;&lt;br /&gt;
reg  in_t;&lt;br /&gt;
wire detectOk_t;&lt;br /&gt;
wire detectFail_t;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock_t = 0;&lt;br /&gt;
    forever #1 clock_t = ~clock_t;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
        in_t = 1;&lt;br /&gt;
        reset_t = 0;&lt;br /&gt;
    #2  reset_t = 1;&lt;br /&gt;
    #10 in_t = 0;&lt;br /&gt;
    #10 in_t = 1;&lt;br /&gt;
    #10 $stop();&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
FSM1 DUT(&lt;br /&gt;
    .clock(clock_t),&lt;br /&gt;
    .reset(reset_t),&lt;br /&gt;
    .in(in_t),&lt;br /&gt;
    .detectOk(detectOk_t),&lt;br /&gt;
    .detectFail(detectFail_t)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2: Automat ce detecteaza fronturile crescatoare ale unui semnal===&lt;br /&gt;
Automatul ce detecteaza fronturile crescatoare are un singur semnal de intrare &amp;#039;&amp;#039;in&amp;#039;&amp;#039;, care reprezinta semnalul analizat si o singura iesire, &amp;#039;&amp;#039;out&amp;#039;&amp;#039;, generand pe aceasta un puls lung cat o perioada de ceas la fiecare aparitie a unui front crescator pe &amp;#039;&amp;#039;in&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Vom avea nevoie de 3 stari:&lt;br /&gt;
* Q0: automatul intra in aceasta stare la reset si va ramane in aceasta atata timp cat intrarea este 0 (inca nu a aparut niciun front crescator).&lt;br /&gt;
* Q1: automatul intra in aceasta stare atunci cand apare pe intrare un front crescator. Dupa aparitia frontului crescator sunt doua posibilitati: linia ramane in 1, ceea ce duce la trecerea in starea Q2 care va duce iesirea in 0 dupa o perioada de ceas, sau linia trece in 0 dupa un ciclu de ceas, ceea ce duce la revenirea in starea Q0.&lt;br /&gt;
* Q2: automatul intra in aceasta stare atunci cand linia de intrare ramane in 1 mai mult de o perioada de ceas. Automatul va ramane in aceasta stare atata timp cat &amp;#039;&amp;#039;in&amp;#039;&amp;#039; ramane in 1 si va reveni in starea Q0 imediat ce &amp;#039;&amp;#039;in&amp;#039;&amp;#039; revine in 0.&lt;br /&gt;
&lt;br /&gt;
Graful automatului este:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Organigrama FSM rising edge.png]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea automatului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module FSM2(&lt;br /&gt;
    input clock,&lt;br /&gt;
    input in,&lt;br /&gt;
    input reset,&lt;br /&gt;
    output out&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
localparam Q0 = 2&amp;#039;b00;&lt;br /&gt;
localparam Q1 = 2&amp;#039;b01;&lt;br /&gt;
localparam Q2 = 2&amp;#039;b10;&lt;br /&gt;
&lt;br /&gt;
reg [1:0] state, state_next;&lt;br /&gt;
&lt;br /&gt;
always@(posedge clock) begin&lt;br /&gt;
    if(reset == 0)&lt;br /&gt;
        state &amp;lt;= Q0;&lt;br /&gt;
    else&lt;br /&gt;
        state &amp;lt;= state_next;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
always@(*) begin&lt;br /&gt;
    state_next = state;&lt;br /&gt;
    case(state)&lt;br /&gt;
        Q0: begin&lt;br /&gt;
                if(in == 1) state_next = Q1;&lt;br /&gt;
            end&lt;br /&gt;
        Q1: begin&lt;br /&gt;
                if(in == 0) state_next = Q0;&lt;br /&gt;
                if(in == 1) state_next = Q2;&lt;br /&gt;
            end&lt;br /&gt;
        Q2: begin&lt;br /&gt;
                if(in == 0) state_next = Q0;&lt;br /&gt;
            end&lt;br /&gt;
        default: state_next = Q0;&lt;br /&gt;
	endcase&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
assign out   = (state == Q1);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea unui modul de test pentru FSM2&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module FSM2_TB();&lt;br /&gt;
&lt;br /&gt;
reg  clock_t;&lt;br /&gt;
reg  reset_t;&lt;br /&gt;
reg  in_t;&lt;br /&gt;
wire out_t;&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
    clock_t = 0;&lt;br /&gt;
    forever #1 clock_t = ~clock_t;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
initial begin&lt;br /&gt;
        in_t = 0;&lt;br /&gt;
        reset_t = 0;&lt;br /&gt;
    #2  reset_t = 1;&lt;br /&gt;
    #10 in_t = 1;&lt;br /&gt;
    #5	in_t = 0;&lt;br /&gt;
    #10 in_t = 1;&lt;br /&gt;
    #5	in_t = 0;&lt;br /&gt;
    #10 $stop();&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
FSM2 DUT(&lt;br /&gt;
    .clock(clock_t),&lt;br /&gt;
    .reset(reset_t),&lt;br /&gt;
    .in(in_t),&lt;br /&gt;
    .out(out_t)&lt;br /&gt;
);&lt;br /&gt;
   &lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Exerciții==&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
	<entry>
		<id>http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_9_:_Numaratorul&amp;diff=7392</id>
		<title>CID aplicatii 9 : Numaratorul</title>
		<link rel="alternate" type="text/html" href="http://wiki.dcae.pub.ro/index.php?title=CID_aplicatii_9_:_Numaratorul&amp;diff=7392"/>
		<updated>2022-05-03T10:01:51Z</updated>

		<summary type="html">&lt;p&gt;Gvpopescu: /* Exemplul 2: Observarea vitezei de variație a biților unui numărător */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Numărătorul ==&lt;br /&gt;
Numărătorul este cel mai simplu automat, fiind format dintr-un registru (element de memorare) ce reține valoarea curentă a acestuia și un circuit de incrementare (circuit de reacție) ce generează la ieșirea sa valoarea ce va trebui stocată în registru la următorul front crescător de ceas (valoarea curentă incrementată cu 1). &lt;br /&gt;
&lt;br /&gt;
În figura de mai jos este reprezentat un numărător cu reset sincron:&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Numarator cu reset.png|600px]]&lt;br /&gt;
&lt;br /&gt;
În cazul de mai sus, cât timp semnalul &amp;#039;&amp;#039;reset&amp;#039;&amp;#039; este activ, valoarea numărătorului va fi 0. Atunci când semnalul &amp;#039;&amp;#039;reset&amp;#039;&amp;#039; nu este activ, numărătorul își va incrementa valoarea la fiecare front crescător de ceas.&lt;br /&gt;
&lt;br /&gt;
== Divizor de frecvență cu factor de divizare putere a lui 2==&lt;br /&gt;
În unele cazuri, apare necesitatea obținerii unor semnale de ceas cu frecvență mai mică decât cea a ceasului de sistem. Aceste noi semnale de ceas pot fi obținute chiar din semnalul de ceas al sistemului, prin circuite care realizează divizarea acestuia. Cea mai simplă divizare a unui semnal de ceas este cea cu factor de divizare egal cu o putere a lui 2. Pentru acest caz, putem folosi un numărător.&lt;br /&gt;
&lt;br /&gt;
Dacă urmărim figura de mai jos în care sunt reprezentate variațiile fiecărui bit în timpul funcționării unui numărător pe 4 biți, observăm că, cu cât ordinul bitului crește (este mai semnificativ), frecvența de variație este mai mică. Între frecvențele de variație corespunzătoare a doi biți succesivi există următoarea relație: frecvența unui bit este de două ori mai mică decât frecvența bitului anterior (mai puțin semnificativ).&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Divizare frecventa.png]]&lt;br /&gt;
&lt;br /&gt;
Observând că frecvența bitului 0 este de două ori mai mică decât cea a ceasului, putem concluziona că frecvența de variație a bitului cu indicele N este dată de: &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;f&amp;lt;sub&amp;gt;bN&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039; = &amp;#039;&amp;#039;f&amp;lt;sub&amp;gt;clk&amp;lt;/sub&amp;gt; / 2&amp;lt;sup&amp;gt;N+1&amp;lt;/sup&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Așadar, pentru a realiza un divizor de frecvență cu factor de divizare putere a lui 2, putem folosi un numărător îndeajuns de mare, din care extragem bitul cu frecvența de variație egală cu frecvența dorită.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Exemple==&lt;br /&gt;
===Exemplul 1: Implementarea unui numărător cu reset sincron===&lt;br /&gt;
În acest exemplu vom realiza implementarea numărătorului cu reset sincron prezentat în figura din secțiunea de introducere teoretică. În plus, vom folosi parametrul WIDTH pentru a controla dimensiunea acestuia.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Numărătorului cu reset sincron&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module Numarator&lt;br /&gt;
#(parameter WIDTH = 8)&lt;br /&gt;
(&lt;br /&gt;
    input clock,&lt;br /&gt;
    input reset_n,&lt;br /&gt;
    output reg [WIDTH-1:0] count  &lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always@(posedge clock) begin&lt;br /&gt;
    if(reset_n == 0)&lt;br /&gt;
        count &amp;lt;= 0;&lt;br /&gt;
    else&lt;br /&gt;
        count &amp;lt;= count + 1;  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea unui modul de test pentru numărător&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
`timescale 1ns/1ps&lt;br /&gt;
&lt;br /&gt;
module Numarator_TB();&lt;br /&gt;
&lt;br /&gt;
parameter WIDTH_T = 5;&lt;br /&gt;
reg reset_n_t, clock_t;&lt;br /&gt;
wire [WIDTH_T-1:0] count_t;&lt;br /&gt;
	&lt;br /&gt;
initial begin&lt;br /&gt;
    clock_t = 0;&lt;br /&gt;
    forever #1 clock_t = ~clock_t;&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
initial begin&lt;br /&gt;
        reset_n_t = 0;&lt;br /&gt;
    #2 	reset_n_t = 1;&lt;br /&gt;
    #500 $stop();	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
Numarator #(.WIDTH(WIDTH_T)) DUT(&lt;br /&gt;
    .clock(clock_t),&lt;br /&gt;
    .reset_n(reset_n_t),&lt;br /&gt;
    .count(count_t)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; Cât timp semnalul &amp;#039;&amp;#039;reset&amp;#039;&amp;#039; este inactiv, numărătorul își va incrementa valoarea la fiecare front crescător de ceas. Când va ajunge la valoarea sa maximă (de exemplu, 31 pentru un numărător pe 5 biți), va avea loc o depășire și având la dispozitie un număr limitat de biți (de exemplu, 5), semnalul de ieșire va deveni 0 (reținem doar cei mai puțin semnificativi 5 biți), circuitul reluând numărarea de la capat.&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2: Observarea vitezei de variație a biților unui numărător===&lt;br /&gt;
În acest exemplu vom realiza implementarea unui divizor de frecvență ce generează la ieșire 4 semnale de ceas cu următoarele frecvențe:&lt;br /&gt;
* &amp;#039;&amp;#039;clkout1&amp;#039;&amp;#039;: semnal de ceas cu frecvența de 1 Hz.&lt;br /&gt;
* &amp;#039;&amp;#039;clkout2&amp;#039;&amp;#039;: semnal de ceas cu frecvența de 2 Hz.&lt;br /&gt;
* &amp;#039;&amp;#039;clkout4&amp;#039;&amp;#039;: semnal de ceas cu frecvența de 4 Hz.&lt;br /&gt;
* &amp;#039;&amp;#039;clkout8&amp;#039;&amp;#039;: semnal de ceas cu frecvența de 8 Hz.&lt;br /&gt;
&lt;br /&gt;
Dacă aplicăm formula &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;f&amp;lt;sub&amp;gt;bN&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039; = &amp;#039;&amp;#039;f&amp;lt;sub&amp;gt;clk&amp;lt;/sub&amp;gt; / 2&amp;lt;sup&amp;gt;N+1&amp;lt;/sup&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; cunoscând că frecvența de ceas a FPGA-ului este de 125 MHz, vom obține:&lt;br /&gt;
* &amp;#039;&amp;#039;clkout1&amp;#039;&amp;#039; poate fi obținut prin bitul 26 al unui numărător.&lt;br /&gt;
* &amp;#039;&amp;#039;clkout2&amp;#039;&amp;#039; poate fi obținut prin bitul 25 al unui numărător.&lt;br /&gt;
* &amp;#039;&amp;#039;clkout4&amp;#039;&amp;#039; poate fi obținut prin bitul 24 al unui numărător.&lt;br /&gt;
* &amp;#039;&amp;#039;clkout8&amp;#039;&amp;#039; poate fi obținut prin bitul 23 al unui numărător.&lt;br /&gt;
&lt;br /&gt;
Din rezultatele de mai sus, rezultă că avem nevoie de un numărător pe 27 biți, astfel încât să putem folosi bitul cel mai semnificativ (bitul 26) pentru generarea semnalului de ceas cu frecvența cea mai mică.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea Verilog a circuitului&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module clock_generator(&lt;br /&gt;
    input clock,&lt;br /&gt;
    input reset,&lt;br /&gt;
    output clkout1,&lt;br /&gt;
    output clkout2,&lt;br /&gt;
    output clkout4,&lt;br /&gt;
    output clkout8,&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
reg [26:0] count;&lt;br /&gt;
&lt;br /&gt;
always@(posedge clock) begin&lt;br /&gt;
    if(reset == 1)&lt;br /&gt;
        count &amp;lt;= 0;&lt;br /&gt;
    else&lt;br /&gt;
        count &amp;lt;= count + 1;  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
assign clkout1 = count[26];&lt;br /&gt;
assign clkout2 = count[25];&lt;br /&gt;
assign clkout4 = count[24];&lt;br /&gt;
assign clkout8 = count[23];&lt;br /&gt;
&lt;br /&gt;
endmodule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Observație:&amp;#039;&amp;#039;&amp;#039; Cerința ca reset să fie activ în 1 este impusă de logica în care lucrează butoanele FPGA-ului.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea circuitului pe FPGA&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Realizați sinteza circuitului pe FPGA, ținând cont de următoarele constrângeri de I/O:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
||&amp;#039;&amp;#039;&amp;#039;Port&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Conexiune&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| clock || CLK_125MHz&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| reset || Button 0 &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| clkout1 || LED3&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| clkout2  || LED2&lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| clkout4  || LED1 &lt;br /&gt;
|-  align=&amp;quot;center&amp;quot;&lt;br /&gt;
| clkout8  || LED0 &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Observați viteza cu care fiecare din LED-uri se stinge și se aprinde.&lt;br /&gt;
&lt;br /&gt;
== Exerciții==&lt;br /&gt;
===Exercițiul 1===&lt;br /&gt;
Implementați un numărător parametrizat cu reset sincron și semnal de &amp;#039;&amp;#039;enable&amp;#039;&amp;#039;. Semnalul &amp;#039;&amp;#039;enable&amp;#039;&amp;#039; controlează funcționarea numărătorului astfel: când este activ (egal cu 1), permite funcționarea normală (incrementare la fiecare front crescător de ceas); când este inactiv (egal cu 0), va determina numărătorul să își păstreze valoarea curentă.&lt;br /&gt;
&lt;br /&gt;
Implementați și un modul de test care să testeze funcționarea corectă a circuitului.&lt;br /&gt;
&lt;br /&gt;
===Exercițiul 2===&lt;br /&gt;
Implementați un numărător parametrizat cu reset sincron și capacitatea de a număra crescător sau descrescător. Controlul direcției de numărare se va realiza cu ajutorul unui semnal &amp;#039;&amp;#039;count_updown&amp;#039;&amp;#039;, care controlează funcționarea numărătorului astfel: când este 0, numărătorul va număra crescător, prin incrementarea valorii curente, iar când este 1, numărătorul va număra descrescător, prin decrementarea valorii curente&lt;br /&gt;
&lt;br /&gt;
Implementați și un modul de test care să testeze funcționarea corectă a circuitului.&lt;br /&gt;
&lt;br /&gt;
===Exercițiul 3===&lt;br /&gt;
Implementați circuitul descris prin schema de mai jos, știind că:&lt;br /&gt;
* COUNTER este un numărător pe 32 biți fără reset.&lt;br /&gt;
* RAM este o memorie 16x4b, cu citire sincrona.&lt;br /&gt;
* ROM este o memorie 16x4b, ce are descrierea prezentată mai jos.&lt;br /&gt;
&lt;br /&gt;
[[Fișier:Cid_lab6.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Implementarea modulului ROM&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Verilog&amp;quot;&amp;gt;&lt;br /&gt;
module ROM(&lt;br /&gt;
    input [3:0] in,&lt;br /&gt;
    output reg [3:0] out&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
always @(in)&lt;br /&gt;
    case(in)&lt;br /&gt;
        0: out = 4&amp;#039;b0000;&lt;br /&gt;
        1: out = 4&amp;#039;b0110;&lt;br /&gt;
        2: out = 4&amp;#039;b0011;&lt;br /&gt;
        3: out = 4&amp;#039;b1110;&lt;br /&gt;
        4: out = 4&amp;#039;b1011;&lt;br /&gt;
        5: out = 4&amp;#039;b1111;&lt;br /&gt;
        6: out = 4&amp;#039;b0111;&lt;br /&gt;
        7: out = 4&amp;#039;b1100;&lt;br /&gt;
        8: out = 4&amp;#039;b0001;&lt;br /&gt;
        9: out = 4&amp;#039;b0101;&lt;br /&gt;
        10: out = 4&amp;#039;b1101;&lt;br /&gt;
        11: out = 4&amp;#039;b1010;&lt;br /&gt;
        12: out = 4&amp;#039;b0010;&lt;br /&gt;
        13: out = 4&amp;#039;b0100;&lt;br /&gt;
        14: out = 4&amp;#039;b1000;&lt;br /&gt;
        15: out = 4&amp;#039;b1001;&lt;br /&gt;
        default: out = 4&amp;#039;b0000;&lt;br /&gt;
    endcase&lt;br /&gt;
endmodule&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Realizați un modul de test în care să scrieți memoria RAM cu date, astfel încât să se realizeze citirea memoriei ROM în ordine, la fiecare ciclu de ceas (adresa 0 -&amp;gt; adresa 1 -&amp;gt; ... -&amp;gt; adresa 15 -&amp;gt; adresa 0 -&amp;gt; ...)&lt;/div&gt;</summary>
		<author><name>Gvpopescu</name></author>
	</entry>
</feed>