https://stackoverflow.com/q/20084928/3011009
Digamos que quiero escribir un módulo combinacional que usa 4 entradas y 3 salidas. Para modelar mi lógica, hago algo como esto:
Código: Seleccionar todo
module ifelse (
input wire a,
input wire b,
input wire c,
input wire d,
output reg y1,
output reg y2,
output reg y3
);
always @* begin
if (a==1'b1 && b==1'b0) begin
y1 = 1'b0;
y3 = 1'b1;
end
else if (a==1'b0 && c==1'b1 && d==1'b0) begin
y2 = 1'b1;
y1 = 1'b1;
end
else if (a==1'b0 && c==1'b0) begin
y3 = 1'b0;
y2 = 1'b0;
end
end
endmodule
Código: Seleccionar todo
module ifelse (
input wire a,
input wire b,
input wire c,
input wire d,
output reg y1,
output reg y2,
output reg y3
);
always @* begin
if (a==1'b1 && b==1'b0) begin
y1 = 1'b0;
y3 = 1'b1;
y2 = 1'bx;
end
else if (a==1'b0 && c==1'b1 && d==1'b0) begin
y2 = 1'b1;
y1 = 1'b1;
y3 = 1'bx;
end
else if (a==1'b0 && c==1'b0) begin
y3 = 1'b0;
y2 = 1'b0;
y1 = 1'bx;
end
else begin
y1 = 1'bx;
y2 = 1'bx;
y3 = 1'bx;
end
end
endmodule
Entonces la cuestión es: cómo dar un valor "por defecto" a las salidas cuando alguna de ellas no se usa en alguno de los bloques if-else.¿Hay algo parecido a un "default" para todas aquellas señales que no se actualizan en el bloque, de forma que una vez evaluado, si alguna salida no se ha actualizado, tome el valor "por defecto" o a un valor "don't care"?
Hasta ahora, lo que se me ha ocurrido hacer es esto:
Código: Seleccionar todo
module ifelse(
input wire a,
input wire b,
input wire c,
input wire d,
output reg y1,
output reg y2,
output reg y3
);
always @* begin
// default values
y1 = 1'bx;
y2 = 1'bx;
y3 = 1'bx;
if (a==1'b1 && b==1'b0) begin
y1 = 1'b0;
y3 = 1'b1;
end
else if (a==1'b0 && c==1'b1 && d==1'b0) begin
y2 = 1'b1;
y1 = 1'b1;
end
else if (a==1'b0 && c==1'b0) begin
y3 = 1'b0;
y2 = 1'b0;
end
end
endmodule
Código: Seleccionar todo
module ifelse(
input wire a,
input wire b,
input wire c,
input wire d,
output reg y1,
output reg y2,
output reg y3
);
always @* begin
if (a==1'b1 && b==1'b0) begin
y1 = 1'b0;
y3 = 1'b1;
end
else if (a==1'b0 && c==1'b1 && d==1'b0) begin
y2 = 1'b1;
y1 = 1'b1;
end
else if (a==1'b0 && c==1'b0) begin
y3 = 1'b0;
y2 = 1'b0;
end
@* = x; // esto no existe en Verilog. Sería para indicar que todas las salidas no actualizadas toman el valor "dont care"
end
endmodule
La respuesta que me dieron es que lo que yo hago es lo correcto, salvo por un detalle: que no puedo asignar un valor "x" a una variable porque "x" significa "desconocido", no "don't care". Resulta que el valor "x" sólo significa "don't care" cuando se usa como expresión en un case (realmente cuando se usa en un casex)