Declaração de caso Verilog
O
case
A instrução verifica se a expressão fornecida corresponde a uma das outras expressões na lista e ramifica de acordo. Normalmente é usado para implementar um multiplexador. A construção if-else pode não ser adequada se houver muitas condições a serem verificadas e sintetizar em um codificador de prioridade em vez de um multiplexador. Sintaxe
Um caso Verilog instrução começa com o
case
palavra-chave e termina com o endcase
palavra-chave. A expressão entre parênteses será avaliada exatamente uma vez e comparada com a lista de alternativas na ordem em que são escritas e as instruções para as quais a alternativa corresponde à expressão fornecida são executadas. Um bloco de várias instruções deve ser agrupado e estar dentro de begin
e end
.
// Here 'expression' should match one of the items (item 1,2,3 or 4)
case (<expression>)
case_item1 : <single statement>
case_item2,
case_item3 : <single statement>
case_item4 : begin
<multiple statements>
end
default : <statement>
endcase
Se nenhum dos itens case corresponder à expressão fornecida, as instruções dentro do
default
item é executado. O default
instrução é opcional e pode haver apenas um default
declaração em uma declaração de caso. As instruções case podem ser aninhadas. A execução sairá do bloco case sem fazer nada se nenhum dos itens corresponder à expressão e um
default
declaração não é dada. Exemplo
O módulo de design mostrado abaixo tem um sinal de seleção de 2 bits para rotear uma das outras três entradas de 3 bits para o sinal de saída chamado. Um
case
A instrução é usada para atribuir a entrada correta à saída com base no valor de sel. Como sel é um sinal de 2 bits, ele pode ter 2
2
combinações, de 0 a 3. A instrução padrão ajuda a definir a saída como 0 se sel for 3.
module my_mux (input [2:0] a, b, c, // Three 3-bit inputs
[1:0] sel, // 2-bit select signal to choose from a, b, c
output reg [2:0] out); // Output 3-bit signal
// This always block is executed whenever a, b, c or sel changes in value
always @ (a, b, c, sel) begin
case(sel)
2'b00 : out = a; // If sel=0, output is a
2'b01 : out = b; // If sel=1, output is b
2'b10 : out = c; // If sel=2, output is c
default : out = 0; // If sel is anything else, out is always 0
endcase
end
endmodule
Esquema de hardware
O código rtl é elaborado para obter um esquema de hardware que representa um multiplexador de 4 para 1.
Veja que a saída é zero quando sel é 3 e corresponde às entradas atribuídas para outros valores.
Registro de simulação
ncsim> run [0] a=0x4 b=0x1 c=0x1 sel=0b11 out=0x0 [10] a=0x5 b=0x5 c=0x5 sel=0b10 out=0x5 [20] a=0x1 b=0x5 c=0x6 sel=0b01 out=0x5 [30] a=0x5 b=0x4 c=0x1 sel=0b10 out=0x1 [40] a=0x5 b=0x2 c=0x5 sel=0b11 out=0x0 ncsim: *W,RNQUIE: Simulation is complete.
Em uma instrução case, a comparação só é bem-sucedida quando cada bit da expressão corresponde a uma das alternativas, incluindo 0, 1, x e z. No exemplo mostrado acima, se algum dos bits em sel for x ou z, o
default
A instrução será executada porque nenhuma das outras alternativas correspondeu. Nesse caso, a saída será toda zero. Registro de simulação
ncsim> run [0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x0 [10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x0 [20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x0 [30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x0 [40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x0 [50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x0 [60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x0 [70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0 [80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x0 [90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x0 ncsim: *W,RNQUIE: Simulation is complete.
Se a instrução case no projeto tiver x e z nas alternativas de item de caso, os resultados seriam bem diferentes.
module my_mux (input [2:0] a, b, c,
[1:0] sel,
output reg [2:0] out);
// Case items have x and z and sel has to match the exact value for
// output to be assigned with the corresponding input
always @ (a, b, c, sel) begin
case(sel)
2'bxz : out = a;
2'bzx : out = b;
2'bxx : out = c;
default : out = 0;
endcase
end
endmodule
Registro de simulação ncsim> run [0] a=0x4 b=0x1 c=0x1 sel=0bxx out=0x1 [10] a=0x3 b=0x5 c=0x5 sel=0bzx out=0x5 [20] a=0x5 b=0x2 c=0x1 sel=0bxx out=0x1 [30] a=0x5 b=0x6 c=0x5 sel=0bzx out=0x6 [40] a=0x5 b=0x4 c=0x1 sel=0bxz out=0x5 [50] a=0x6 b=0x5 c=0x2 sel=0bxz out=0x6 [60] a=0x5 b=0x7 c=0x2 sel=0bzx out=0x7 [70] a=0x7 b=0x2 c=0x6 sel=0bzz out=0x0 [80] a=0x0 b=0x5 c=0x4 sel=0bxx out=0x4 [90] a=0x5 b=0x5 c=0x5 sel=0bxz out=0x5 ncsim: *W,RNQUIE: Simulation is complete.
Como um caso é diferente de if-else ?
O
case
instrução é diferente de if-else-if
de duas maneiras:- Expressões fornecidas em um
if-else
bloco são mais gerais em umcase
bloco, uma única expressão corresponde a vários itens case
fornecerá um resultado definitivo quando houver valores X e Z em uma expressão
Verilog