Sé que una declaración de caso en Verilog puede comenzar con caso, casex o casez. Sin embargo, con casex y casez, ¿cuándo usaría uno sobre el otro?
Sé que una declaración de caso en Verilog puede comenzar con caso, casex o casez. Sin embargo, con casex y casez, ¿cuándo usaría uno sobre el otro?
Supongo que puedes leer el LRM, pero estás pidiendo una opinión: ¿Por qué ?
El problema es que muchas funciones de Verilog se incorporaron a la solicitud específica de un usuario, y algunas de esas funciones no son tan útiles. Y a veces se puso una característica porque parecía consistente y fácil de implementar en ese momento, pero al final resultó ser contraproducente. casex
podría ser una de esas características. Pero gran parte de esto es historia perdida.
Nunca debes usar casex
. casex
es notorio por causar diferencias entre simulaciones previas y posteriores a la síntesis.
Usted usa casez
para modelar las condiciones de "no importa" con un ?
en el ítem de su caso. Sin embargo, si puedes moverte a SystemVerilog, la instrucción case inside
es aún mejor porque solo se ve en la expresión de elemento de caso, no en la expresión de selección de caso.
El crédito va a ASIC World para obtener códigos de ejemplo.
Trata todos los valores de z en la expresión de caso como "no importa".
Ejemplo:
casez(opcode)
4'b1zzx : begin // Don't care about lower 2:1 bit, bit 0 match with x
out = a;
$display("@%0dns 4'b1zzx is selected, opcode %b",$time,opcode);
end
4'b01?? : begin
out = b; // bit 1:0 is don't care
$display("@%0dns 4'b01?? is selected, opcode %b",$time,opcode);
end
4'b001? : begin // bit 0 is don't care
out = c;
$display("@%0dns 4'b001? is selected, opcode %b",$time,opcode);
Trata todos los valores de x y z en la expresión del caso como no importa.
Ejemplo:
casex(opcode)
4'b1zzx : begin // Don't care 2:0 bits
out = a;
$display("@%0dns 4'b1zzx is selected, opcode %b",$time,opcode);
end
4'b01?? : begin // bit 1:0 is don't care
out = b;
$display("@%0dns 4'b01?? is selected, opcode %b",$time,opcode);
end
4'b001? : begin // bit 0 is don't care
out = c;
$display("@%0dns 4'b001? is selected, opcode %b",$time,opcode);
end
Por supuesto, necesitará un endcase
al final de los módulos casez
y casex
.
Lea otras preguntas en las etiquetas verilog