Baixe o app para aproveitar ainda mais
Prévia do material em texto
Verilog HDL Slides cedidos pelo Prof. Wagner L. A. de OliveiraSlides cedidos pelo Prof. Wagner L. A. de Oliveira Motivação Elementos de processamento mais utilizadosElementos de processamento mais utilizados •• Obs.: de forma geral, a depender da aplicaObs.: de forma geral, a depender da aplicaçção e do hardware utilizadoão e do hardware utilizado Verilog HDL Estrutura Geral �� Hierarquia de mHierarquia de móódulosdulos �� MMóódulo representa um componente do sistemadulo representa um componente do sistema •• interfaceinterface •• descridescriçção funcionalão funcional �� estruturalestrutural �� dataflowdataflow �� comportamentalcomportamental �� MMóódulo não pode ser inserido em outro mdulo não pode ser inserido em outro móódulodulo •• necessnecessáário uso de instanciario uso de instanciaççãoão •• pode fazer parte do mesmo arquivopode fazer parte do mesmo arquivo Estilos de Implementação �� Verilog permite 3 estilos de implementaVerilog permite 3 estilos de implementaççãoão �� EstruturalEstrutural �� DataflowDataflow �� ComportamentalComportamental Estilos de Implementação �� Verilog permite 3 estilos de implementaVerilog permite 3 estilos de implementaççãoão �� EstruturalEstrutural •• circuito especificado atravcircuito especificado atravéés da s da instanciainstanciaçção de componentes jão de componentes jáá existentes existentes (pr(préé--definidos na linguagem ou criados pelo usudefinidos na linguagem ou criados pelo usuáário), rio), os quais são conectados por sinais internosos quais são conectados por sinais internos �� DataflowDataflow �� ComportamentalComportamental Estilos de Implementação �� Verilog permite 3 estilos de implementaVerilog permite 3 estilos de implementaççãoão �� EstruturalEstrutural �� DataflowDataflow •• circuito especificado atravcircuito especificado atravéés de expressões s de expressões llóógicas e aritmgicas e aritmééticas, as quais transformam ticas, as quais transformam conjuntos de entradas em saconjuntos de entradas em saíídasdas �� ComportamentalComportamental Estilos de Implementação �� Verilog permite 3 estilos de implementaVerilog permite 3 estilos de implementaççãoão �� EstruturalEstrutural �� DataflowDataflow �� ComportamentalComportamental •• circuito especificado atravcircuito especificado atravéés do comportamento s do comportamento pretendido, ao estilo de linguagens de programapretendido, ao estilo de linguagens de programaççãoão Sinais: Tipos de Dados �� Duas classes de tipos de dadosDuas classes de tipos de dados Sinais: Tipos de Dados �� Classe Net: usados para interconexãoClasse Net: usados para interconexão wire, triwire, tri wor, triorwor, trior wand, triandwand, triand tri0, tri1tri0, tri1 supply0, supply1 supply0, supply1 ((somente para somente para railsrails em netlistsem netlists)) triregtrireg Sinais: Tipos de Dados �� Classe Net: exemplosClasse Net: exemplos ...... wor a;wor a; wire b, c;wire b, c; ...... assign a = b;assign a = b; assign a = c;assign a = c; ...... Sinais: Tipos de Dados �� Classe Net: exemplosClasse Net: exemplos ...... tri a;tri a; wire b, c;wire b, c; ...... assign a = (b) ? c : 1'bz;assign a = (b) ? c : 1'bz; ...... Sinais: Tipos de Dados �� Classe Net: exemplosClasse Net: exemplos ...... trireg (large) [3:0] # (2, 5, 9) capacitor;trireg (large) [3:0] # (2, 5, 9) capacitor; wire [3:0] b, c;wire [3:0] b, c; ...... assign capacitor = (b) ? c : 4'bz;assign capacitor = (b) ? c : 4'bz; ...... Sinais: Tipos de Dados �� Classe Net: exemplosClasse Net: exemplos Sinais: Tipos de Dados �� Classe Register: usados para armazenamentoClasse Register: usados para armazenamento regreg integerinteger real real ((NÃO SINTETIZNÃO SINTETIZÁÁVELVEL)) time time ((NÃO SINTETIZNÃO SINTETIZÁÁVELVEL)) realtime realtime ((NÃO SINTETIZNÃO SINTETIZÁÁVELVEL)) Sinais: Operadores Tipo Símbolo Função Aritmético * multiplicação / divisão + adição - subtração % módulo + mais unário - menos unário Lógico ! NOT && AND || OR Relacional > maior que < menor que >= maior ou igual <= menor ou igual Tipo Símbolo Função Igualdade == igual != diferente Redução (bit a bit) ~ NOT ~& NAND | OR ~| NOR ^ XOR ^~ XNOR Deslocamento >> à direita << à esquerda Concatenação { } agrupamento de sinais Condicional ? atribuição seletiva Portas: Tipos de Dados �� Pertencentes Pertencentes ààs duas classes bs duas classes báásicas, sicas, seguindo algumas restriseguindo algumas restriççõesões Primitivas: Verilog �� Portas de mPortas de múúltiplas saltiplas saíídasdas Primitivas: Verilog �� Portas de mPortas de múúltiplas entradasltiplas entradas Primitivas: Verilog �� Portas tristatePortas tristate Primitivas: Definidas pelo Usuário �� UDPUDP �� User Defined PrimitiveUser Defined Primitive �� NÃO SINTETIZNÃO SINTETIZÁÁVELVEL �� Dois tiposDois tipos �� CombinacionaisCombinacionais �� SequenciaisSequenciais somente para primitivas sequenciaissomente para primitivas sequenciais Estilo Comportamental �� Blocos proceduraisBlocos procedurais �� always always •• pode representar hardware pode representar hardware COMBINACIONALCOMBINACIONAL ou ou SEQUENCIALSEQUENCIAL •• execuexecuçção contão contíínua, de acordo comnua, de acordo com �� lista de sensibilidadelista de sensibilidade �� alteraalteraçção de sinaisão de sinais �� detecdetecçção de bordasão de bordas �� atrasos (atrasos (NÃO SINTETIZNÃO SINTETIZÁÁVEISVEIS)) �� initialinitial •• execuexecuçção ão úúnica, no innica, no iníício da simulacio da simulaççãoão •• NÃO SINTETIZNÃO SINTETIZÁÁVELVEL always always beginbegin #5 clk = ~clk;#5 clk = ~clk; endend �� always sem lista de sensibilidadealways sem lista de sensibilidade ((NÃO SINTETIZNÃO SINTETIZÁÁVELVEL)) always @ (a or b or sel)always @ (a or b or sel) beginbegin if (sel == 0)if (sel == 0) y = a;y = a; elseelse y = b;y = b; endend �� always: lista sensalways: lista sensíível a quaisquer alteravel a quaisquer alteraççõesões module contador (clock, reset, enable, counter_out);module contador (clock, reset, enable, counter_out); input clock, reset, enable;input clock, reset, enable; output [3:0] counter_out;output [3:0] counter_out; reg [3:0] counter_out;reg [3:0] counter_out; always @ (posedge clock) always @ (posedge clock) // para borda de descida: // para borda de descida: negedgenegedge beginbegin if (reset == 1'b1) if (reset == 1'b1) counter_out <= #1 4'b0000;counter_out <= #1 4'b0000; else else if (enable == 1'b1)if (enable == 1'b1) counter_out <= #1 counter_out + 1;counter_out <= #1 counter_out + 1; endend endmoduleendmodule �� always: lista sensalways: lista sensíível vel àà bordaborda module contador (clock, reset, enable, counter_out);module contador (clock, reset, enable, counter_out); input clock, reset, enable;input clock, reset, enable; ...... always @ (posedge clock)always @ (posedge clock) beginbegin ...... endend initial initial beginbegin clock = 1;clock = 1; reset = 0;reset = 0; enable = 0;enable = 0; endend endmoduleendmodule �� initialinitial Estilo Comportamental �� Estruturas de controleEstruturas de controle �� if if -- elseelse �� casecase �� while while (*)(*) �� repeat repeat (**)(**) �� for for (**)(**) * * sintetizsintetizáávelvel se contiver se contiver @(posedge clock) @(posedge clock) ou ou @(negedge clock) @(negedge clock) ouou disabledisable ** **sintetizsintetizáávelvel para controle constante (valor prpara controle constante (valor préé--determinado)determinado) �� if if -- elseelse if (enable == 1'b1)if (enable == 1'b1) beginbegin data = 10; data = 10; address = 16'hFAFA; address = 16'hFAFA; wr_enable = 1'b1; wr_enable = 1'b1; endend else else beginbegin wr_enable = 1'b0;wr_enable = 1'b0; data = 32'b0;data = 32'b0; address = address + 1;address = address + 1; endend �� casecase case ({seletor1, seletor0})case ({seletor1, seletor0}) 22’’b00 : saida = entrada0;b00 : saida = entrada0; 22’’b01 : saida = entrada1;b01 : saida = entrada1; 22’’b10 : saida = entrada2;b10 : saida = entrada2; 22’’b11 : saida = entrada3;b11 : saida = entrada3; default : saida = 1default : saida = 1’’bX;bX; endcaseendcase �� whilewhile module counter (clk,rst,enable,count);module counter (clk,rst,enable,count); input clk, rst, enable; output [3:0] count; reg [3:0] count;input clk, rst, enable; output [3:0] count; reg [3:0] count; always @ (posedge clk or posedge rst)always @ (posedge clk or posedge rst) if (rst) if (rst) count <= 0;count <= 0; else else begin : COUNTbegin : COUNT while (enable) while (enable) beginbegin count <= count + 1;count <= count + 1; disable COUNT;disable COUNT; endend endend endmoduleendmodule �� forfor for (i = 0; i < 16; i = i +1) for (i = 0; i < 16; i = i +1) beginbegin $display ("Valor atual de i $display ("Valor atual de i éé %d" , i);%d" , i); endend �� repeatrepeat repeat (16)repeat (16) beginbegin $display ("Valor atual de i $display ("Valor atual de i éé %d" , i);%d" , i); i = i + 1;i = i + 1; endend Sinais: Formas de Atribuição �� Dentro de blocos procedurais Dentro de blocos procedurais initialinitial �� atribuiatribuiçção bloqueanteão bloqueante �� quando associada a um atraso, quando associada a um atraso, segura a execusegura a execuçção da sentenão da sentençça seguintea seguinte == �� atribuiatribuiçção não bloqueanteão não bloqueante �� execuexecuçção paralela, independente do uso de atrasosão paralela, independente do uso de atrasos <=<= Sinais: Formas de Atribuição �� Dentro de blocos procedurais Dentro de blocos procedurais alwaysalways �� atribuiatribuiçção usada em blocos combinacionais ão usada em blocos combinacionais (isto (isto éé, , semsem sinal de clock na lista de sensibilidade)sinal de clock na lista de sensibilidade) �� IMPORTANTE: a execuIMPORTANTE: a execuçção ão éé sequencialsequencial == �� atribuiatribuiçção usada em blocos sequenciais ão usada em blocos sequenciais (isto (isto éé, , comcom sinal de clock na lista de sensibilidade)sinal de clock na lista de sensibilidade) �� IMPORTANTE: a execuIMPORTANTE: a execuçção ão éé paralelaparalela <=<= Sinais: Formas de Atribuição �� Fora de blocos proceduraisFora de blocos procedurais �� atribuiatribuiçção contão contíínua, para circuitos combinacionaisnua, para circuitos combinacionais assign assign sinalsinal == �� NÃO SINTETIZNÃO SINTETIZÁÁVEL para classe registerVEL para classe register �� exemplosexemplos assign saida = (habilita) ? data_in : 1'bz; assign saida = (habilita) ? data_in : 1'bz; // condicional// condicional assign saida = data_in;assign saida = data_in; // não condicional// não condicional �� anula atribuianula atribuiçção contão contíínuanua �� NÃO SINTETIZNÃO SINTETIZÁÁVELVEL deassign deassign sinalsinal Subprogramas: Functions Subprogramas: Functions �� Regras de usoRegras de uso �� locais de definilocais de definiçção de uma functionão de uma function •• dentro do mdentro do móódulo no qual ela dulo no qual ela éé utilizadautilizada •• em um arquivo separado, o qual deverem um arquivo separado, o qual deveráá ser incluser incluíído no arquivo do no arquivo que instancia a function, com o uso de uma clque instancia a function, com o uso de uma clááusula usula `include`include �� function function não podenão pode incluir clincluir clááusulas temporaisusulas temporais •• posedge / negedge / # / waitposedge / negedge / # / wait •• em termos de simulaem termos de simulaçção, functions têm tempo zero de atrasoão, functions têm tempo zero de atraso �� function pode ter qualquer nfunction pode ter qualquer núúmero mero de entradas e de entradas e somente uma sasomente uma saíídada �� varivariááveis declaradas dentro veis declaradas dentro de uma function são locais a functionde uma function são locais a function •• a ordem de declaraa ordem de declaraçção dentro da function ão dentro da function define a ordem de passagem de argumentosdefine a ordem de passagem de argumentos Subprogramas: Functions �� Regras de usoRegras de uso �� function pode usar varifunction pode usar variááveis globaisveis globais �� function pode chamar outra functionfunction pode chamar outra function •• não pode chamar uma tasknão pode chamar uma task �� function pode ser usada para modelar function pode ser usada para modelar somentesomente llóógica combinacionalgica combinacional •• não pode modelar lnão pode modelar lóógica sequencialgica sequencial �� function deve ser chamada function deve ser chamada a partir de uma expressãoa partir de uma expressão Subprogramas: Functions �� Exemplo: chamada de functionExemplo: chamada de function module teste_funcao(a, b, c, d, e, f);module teste_funcao(a, b, c, d, e, f); input a, b, c, d, e ;input a, b, c, d, e ; output f;output f; assign f = (xisto (a,b,c,d)) ? e :0;assign f = (xisto (a,b,c,d)) ? e :0; function xisto;function xisto; input k, l, m, n;input k, l, m, n; beginbegin xisto = (k || l) && (m || n);xisto = (k || l) && (m || n); endend endfunctionendfunction endmoduleendmodule Subprogramas: Tasks Subprogramas: Tasks �� Regras de usoRegras de uso �� locais de definilocais de definiçção de uma taskão de uma task •• dentro do mdentro do móódulo no qual ela dulo no qual ela éé utilizadautilizada •• em um arquivo separado, o qual deverem um arquivo separado, o qual deveráá ser incluser incluíído no arquivo do no arquivo que instancia a task, com o uso de uma clque instancia a task, com o uso de uma clááusula usula `include`include �� task pode incluir cltask pode incluir clááusulas temporaisusulas temporais •• posedge / negedge / # / waitposedge / negedge / # / wait �� task pode ter qualquer ntask pode ter qualquer núúmero mero de entradas e sade entradas e saíídasdas �� varivariááveis declaradas dentro veis declaradas dentro de uma task são locais a taskde uma task são locais a task •• a ordem de declaraa ordem de declaraçção dentro da task ão dentro da task define a ordem de passagem de argumentosdefine a ordem de passagem de argumentos Subprogramas: Tasks �� Regras de usoRegras de uso �� task pode usar varitask pode usar variááveis globaisveis globais �� task pode chamar outra task ou functiontask pode chamar outra task ou function �� task pode ser usada para modelar tanto task pode ser usada para modelar tanto llóógica combinacional quanto sequencialgica combinacional quanto sequencial �� task deve ser chamada diretamente task deve ser chamada diretamenteem uma sentenem uma sentenççaa •• não pode ser acionada dentro de uma expressãonão pode ser acionada dentro de uma expressão Subprogramas: Tasks �� Exemplo: chamada de taskExemplo: chamada de task module Converte_Temp(C1, C2, F1, F2);module Converte_Temp(C1, C2, F1, F2); input [7:0] C1, C2;input [7:0] C1, C2; output reg [7:0] F1, F2;output reg [7:0] F1, F2; always @(C1)always @(C1) Celsius_Fahrenheit(C1, F1);Celsius_Fahrenheit(C1, F1); always @(C2)always @(C2) Celsius_Fahrenheit(C2, F2);Celsius_Fahrenheit(C2, F2); task Celsius_Fahrenheit;task Celsius_Fahrenheit; input [7:0] Celsius;input [7:0] Celsius; output [7:0] Fahrenheit;output [7:0] Fahrenheit; Fahrenheit = (9/5) * Celsius + 32;Fahrenheit = (9/5) * Celsius + 32; endtaskendtask endmoduleendmodule Parâmetros �� Definem constantesDefinem constantes �� declarados junto declarados junto ààs portas do ms portas do móódulodulo Parâmetros �� Definem constantesDefinem constantes �� declarados junto declarados junto ààs portas do ms portas do móódulodulo �� UsosUsos �� tamanho de objetostamanho de objetos �� controle de lacontrole de laççosos �� especificaespecificaçção de atrasosão de atrasos �� nomes de estadosnomes de estados �� Exemplos do uso de parâmetrosExemplos do uso de parâmetros module counter (clk,rst,enable,count, clk_out);module counter (clk,rst,enable,count, clk_out); parameterparameter BusWidth = 4, contador = 48, atraso = 20;BusWidth = 4, contador = 48, atraso = 20; input clk, rst, enable; input clk, rst, enable; output clk_out;output clk_out; output [BusWidthoutput [BusWidth--1:0] count; 1:0] count; reg [BusWidthreg [BusWidth--1:0] count;1:0] count; ...... assign #atraso clk_out = clk; assign #atraso clk_out = clk; ...... for (i = 0; i < contador; i = i +1) for (i = 0; i < contador; i = i +1) ...... endmoduleendmodule �� Exemplos do uso de parâmetrosExemplos do uso de parâmetros module adder (a, b, c);module adder (a, b, c); parameterparameter WIDTH = 4;WIDTH = 4; input [WIDTHinput [WIDTH--1:0] a, b;1:0] a, b; output [WIDTH:0] c;output [WIDTH:0] c; ...... endmoduleendmodule module multiplier (x, y, z);module multiplier (x, y, z); input [3:0] x, y;input [3:0] x, y; output [4:0] z;output [4:0] z; wire [4:0] fio1, fio2, fio3;wire [4:0] fio1, fio2, fio3; wire [5:0] fio4, fio5, fio6; wire [5:0] fio4, fio5, fio6; ...... adder adder somadorsomador1 (1 ( ..aa((fio2fio2), .), .bb((fio3)fio3), ., .cc((fio6fio6)) );); defparamdefparam somador1.WIDTH = 5; somador1.WIDTH = 5; // (// (NÃO SINTETIZNÃO SINTETIZÁÁVELVEL)) endmoduleendmodule Atrasos ((NÃO SINTETIZNÃO SINTETIZÁÁVEISVEIS)) �� Antes das etapas de implementaAntes das etapas de implementaçção fão fíísica, sica, não hnão háá informainformaçções sobre os atrasos reais ões sobre os atrasos reais do circuitodo circuito �� Contudo, podeContudo, pode--se modelar atrasos ideais se modelar atrasos ideais para diferentes partes do circuito, para diferentes partes do circuito, objetivandoobjetivando--se estabelecer os tempos se estabelecer os tempos mmááximos de atraso permitidosximos de atraso permitidos �� uso de operadores de atrasouso de operadores de atraso Atrasos ((NÃO SINTETIZNÃO SINTETIZÁÁVEISVEIS)) �� Operadores de atraso (Operadores de atraso (##) são ) são especificados em unidades de tempoespecificados em unidades de tempo �� Para definir tal unidade de tempo, Para definir tal unidade de tempo, utilizautiliza--se uma diretiva de compilase uma diretiva de compilaççãoão �� `timescale <unidade_tempo> / <precisão>`timescale <unidade_tempo> / <precisão> •• ambos valores deverão ser ambos valores deverão ser 11, , 1010 ou ou 100100, , acompanhados da unidade correspondente (acompanhados da unidade correspondente (ss, , msms, , usus, , nsns, , psps, , fsfs)) •• <unidade_tempo><unidade_tempo> éé o valor usado nos operadores de atraso (o valor usado nos operadores de atraso (##)) •• <precisão><precisão> éé o arredondamento utilizado pelo simuladoro arredondamento utilizado pelo simulador �� Exemplo: Exemplo: `timescale 10 us / 100 ns`timescale 10 us / 100 ns Atrasos ((NÃO SINTETIZNÃO SINTETIZÁÁVEISVEIS)) �� Dois tipos de operadores de atrasoDois tipos de operadores de atraso �� assignment delayassignment delay •• atraso precede execuatraso precede execuçção da atribuião da atribuiççãoão #5 x = y + z;#5 x = y + z; Atrasos ((NÃO SINTETIZNÃO SINTETIZÁÁVEISVEIS)) �� Dois tipos de operadores de atrasoDois tipos de operadores de atraso �� assignment delayassignment delay •• atraso precede execuatraso precede execuçção da atribuião da atribuiççãoão #5 x = y + z;#5 x = y + z; �� intraintra--assignment delayassignment delay •• lado direito da atribuilado direito da atribuiçção ão éé calculado tão logo a sentencalculado tão logo a sentençça entra a entra em execuem execuçção, mas resultado somente ão, mas resultado somente éé atribuatribuíído apdo apóós o atrasos o atraso x = #5 y + z;x = #5 y + z; Atrasos ((NÃO SINTETIZNÃO SINTETIZÁÁVEISVEIS)) �� Dois tipos de operadores de atrasoDois tipos de operadores de atraso �� assignment delayassignment delay •• atraso precede execuatraso precede execuçção da atribuião da atribuiççãoão #5 x = y + z;#5 x = y + z; �� intraintra--assignment delayassignment delay •• lado direito da atribuilado direito da atribuiçção ão éé calculado tão logo a sentencalculado tão logo a sentençça entra a entra em execuem execuçção, mas resultado somente ão, mas resultado somente éé atribuatribuíído apdo apóós o atrasos o atraso x = #5 y + z;x = #5 y + z; �� Ambos podem ser combinadosAmbos podem ser combinados #5 x = #5 y + z;#5 x = #5 y + z; Atrasos ((NÃO SINTETIZNÃO SINTETIZÁÁVEISVEIS)) �� Diferentes formas de modelar atrasosDiferentes formas de modelar atrasos Controle de Eventos �� Operador Operador @@ �� detecta evento sobre o sinal detecta evento sobre o sinal àà sua direita, sua direita, permitindo a execupermitindo a execuçção da sentenão da sentençça seguintea seguinte �� exemplosexemplos •• @ (CLK) Q = D;@ (CLK) Q = D; •• @ (posedge CLK) Q = D;@ (posedge CLK) Q = D; •• @ (negedge CLK) Q = D; @ (negedge CLK) Q = D; Controle de Eventos �� SentenSentençça a waitwait �� suspende a execususpende a execuçção da sentenão da sentençça associada a associada (se existir), at(se existir), atéé que a condique a condiçção especificada ão especificada seja verdadeiraseja verdadeira �� NÃO SINTETIZNÃO SINTETIZÁÁVELVEL �� exemplosexemplos •• wait (enable); wait (enable); •• wait (enable) #7 x = y + z; wait (enable) #7 x = y + z; Estrutura fork-join �� Em descriEm descriçções comportamentais, hões comportamentais, háá duas duas formas para agrupar sentenformas para agrupar sentençças em um blocoas em um bloco �� begin begin -- endend •• execuexecuçção sequencial das sentenão sequencial das sentençças entre as entre beginbegin e e endend �� fork fork -- joinjoin •• execuexecuçção paralela das sentenão paralela das sentençças entre as entre forkfork e e joinjoin Estrutura fork-join �� Estrutura Estrutura forkfork--joinjoin assemelhaassemelha--se a um se a um conjunto de conjunto de atribuiatribuiçções não bloqueantesões não bloqueantes �� fork fork -- join join usa usa assignments delaysassignments delays �� atribuiatribuiçções não bloqueantes ões não bloqueantes usam usam intraintra--assignments delaysassignments delays �� NÃO SINTETIZNÃO SINTETIZÁÁVELVEL �� bloco sequencial com atribuibloco sequencial com atribuiçções bloqueantesões bloqueantes reg [7:0] RegX;reg [7:0] RegX;initialinitial beginbegin # 50 RegX = 8# 50 RegX = 8‘‘h01; h01; // 50// 50 # 50 RegX = 8# 50 RegX = 8‘‘h02;h02; // 100// 100 # 50 RegX = 8# 50 RegX = 8‘‘h03;h03; // 150// 150 # 50 RegX = 8# 50 RegX = 8‘‘h04;h04; // 200// 200 endend �� bloco sequencial com atribuibloco sequencial com atribuiçções não bloqueantesões não bloqueantes reg [7:0] RegX;reg [7:0] RegX; initialinitial beginbegin RegX <= # 50 RegX <= # 50 88‘‘h01;h01; // 50// 50 RegX <= # 100 RegX <= # 100 88‘‘h02;h02; // 100// 100 RegX <= # 150RegX <= # 150 88‘‘h03;h03; // 150// 150 RegX <= # 200RegX <= # 200 88‘‘h04;h04; // 200// 200 endend �� bloco concorrentebloco concorrente reg [7:0] RegX;reg [7:0] RegX; initialinitial forkfork # 50 # 50 RegX = 8RegX = 8‘‘h01;h01; // 50// 50 # 100 # 100 RegX = 8RegX = 8‘‘h02;h02; // 100// 100 # 150 # 150 RegX = 8RegX = 8‘‘h03;h03; // 150// 150 # 200 # 200 RegX = 8RegX = 8‘‘h04;h04; // 200// 200 joinjoin
Compartilhar