Eu estava lendo esta página http://www.asic-world.com/verilog/verilog_one_day3.html quando me deparei com o seguinte:
Normalmente, temos que redefinir os flip-flops; assim, toda vez que o relógio faz a transição de 0 para 1 (posedge), verificamos se o reset é afirmado (redefinição síncrona) e continuamos com a lógica normal. Se olharmos atentamente, veremos que, no caso da lógica combinacional, tínhamos "=" para atribuição e, para o bloco seqüencial, tínhamos o operador "<=". Bem, "=" está bloqueando a atribuição e "<=" está bloqueando a atribuição. "=" executa o código sequencialmente dentro de um início / fim, enquanto o não bloqueador "<=" é executado em paralelo.
Eu tinha quase certeza de que as tarefas sem bloqueio eram seqüenciais enquanto as tarefas de bloqueio eram paralelas. Afinal, você pode fazer atribuições de bloqueio com instruções de atribuição fora dos blocos sempre, e todas elas são executadas em paralelo. Isso é um erro ou o comportamento é diferente dentro de um bloco always? E, se o comportamento for diferente dentro de um bloco always, as atribuições de não bloqueio podem ser feitas fora de um bloco always?
assign
instruções ocorrem fora dos blocos always e geralmente são usadas para descrever a lógica combinatória (sem travamento) (enquanto os blocos sempre, com algumas exceções, descrevem a lógica seqüencial). AFAIK,assign
instruções sempre executam "em paralelo" sempre que seu LHS tiver uma alteração de valor.As instruções de atribuição não são "bloqueadoras" ou "não bloqueadas", elas são "contínuas". A saída de uma instrução de atribuição é sempre igual à função especificada de suas entradas. As atribuições "bloqueio" e "não bloqueio" existem apenas dentro dos blocos sempre.
Uma atribuição de bloqueio entra em vigor imediatamente após ser processada. Uma atribuição sem bloqueio ocorre no final do processamento do "delta de tempo" atual.
Os blocos always podem ser usados para modelar lógica combinatória ou seqüencial (o systemverilog tem always_comb e always_ff para tornar isso explícito). Ao modelar a lógica combinatória, geralmente é mais eficiente usar =, mas normalmente não importa.
Ao modelar a lógica seqüencial (por exemplo, sempre @ (posedge clk)), você normalmente usa asserções sem bloqueio. Isso permite determinar o "estado após o limite do relógio" em termos de "o estado antes do limite do relógio".
Às vezes, é útil usar atribuições de bloqueio em blocos sequenciais sempre como "variáveis". Se você fizer isso, há duas regras importantes a serem lembradas.
A quebra dessas regras provavelmente resultará em falhas de síntese e / ou diferenças de comportamento entre simulação e síntese.
fonte
O termo atribuição de bloqueio confunde as pessoas porque a palavra bloqueio parece sugerir lógica seqüencial no tempo. Mas, na lógica sintetizada , isso não significa isso , porque tudo opera em paralelo .
Talvez um termo menos confuso seja a atribuição imediata , que ainda diferenciaria os resultados intermediários da lógica combinacional das entradas para elementos de memória não transparentes (por exemplo, registros com clock), que podem ter atrasado a atribuição .
Do ponto de vista legalista, tudo funciona muito bem. De fato, você pode considerar
=
uma operação de bloqueio (sequencial no tempo), mesmo dentro dealways_comb
sequências. No entanto, a distinção entre sequencial e paralelo não faz absolutamente nenhuma diferença neste caso, porque oalways_comb
bloco é definido para repetir até que a sequência de instruções converja em um estado estável - que é exatamente o que o circuito do hardware fará (se atingir o tempo) requisitos).O subconjunto sintetizável do Verilog (e especialmente o SystemVerilog) é extremamente simples e fácil de usar - depois de conhecer os idiomas necessários. Você apenas precisa superar o uso inteligente da terminologia associada aos chamados elementos comportamentais da linguagem.
fonte
initial
instruções dentro deprogram
blocos, usa a atribuição de bloqueio (sequencial de tempo) exclusivamente. Isso é útil para projeto testbench , mas geralmente não para a especificação RTL.