¿Cómo convierto un número al complemento de dos en verilog?
Pregunta
Estoy tratando de diseñar un restador sumador de 4 bits en verilog. Esto es solo la segunda cosa que he escrito en verilog, y todavía no conozco la sintaxis correcta. Este es el módulo que tengo hasta ahora:
module Question3(carryin, X, Y, Z, S, carryout, overflow);
parameter n = 4;
input carryin, Z;
input [n-1:0]X, Y;
output reg [n-1:0]S;
output reg carryout, overflow;
if(Z==0)
begin
Y = not(y) + 4'b0001;
end
always @(X, Y, carryin)
begin
{carryout, S} = X + Y + carryin;
overflow = carryout ^ X[n-1]^Y[n-1]^S[n-1];
end
endmodule
Mi compilador (xilinx 10.1), sigue diciendo "Error de sintaxis cerca de si". He intentado muchas formas diferentes de hacer la conversión, incluido el uso de un Caso que toma Y como argumento, luego verifica todas las combinaciones posibles de 4 bits y las convierte al complemento de dos.
Z es lo que determina si el sumador hace una resta o suma. Si es 0, significa resta, y quiero convertir y en el complemento de dos, luego simplemente sumar. Estoy seguro de que el resto del sumador es correcto, simplemente no sé qué es lo que está mal en la parte en la que estoy tratando de convertir.
Solución
reg [n-1:0] Y_compl;
always @( Z, Y, X, carryin ) begin
Y_ = ( ~Y + 4'b0001 );
if ( Z == 1'b0 ) begin
{carryout, S} = X + Y_compl + carryin;
overflow = carryout ^ X[n-1] ^ Y_compl[n-1] ^ S[n-1];
end
else begin
{carryout, S} = X + Y + carryin;
overflow = carryout ^ X[n-1] ^ Y[n-1] ^ S[n-1];
end
end
Un par de puntos importantes.
- Coloca la instrucción if dentro del bloque always. No utilice dos bloques siempre, creará una condición de carrera en el simulador.
- Creé una nueva variable, Y_ porque el uso de Y, que es una entrada, recuerde, en el lado izquierdo de una tarea probablemente inferiremos pestillos o haremos algo más desagradable cuando sintetice.
- Sugiero usar el operador de inversión a nivel de bits '~' para invertir Y en lugar de 'no' primitivo. La herramienta de síntesis tiene más libertad para optimizar su código de esta manera.
- Vuelva a verificar los resultados correctos, ha pasado un tiempo desde que construí un sumador.
Otros consejos
Estás usando una minúscula " y " en " Y = not (y) + 4'b0001; "
Además, estás usando más adiciones de las que necesitas. X-Y es lo mismo que NOT (NOT (X) + Y).
coloca la sentencia if dentro de un bloque inicial
http://www.asic-world.com/verilog/vbehave1.html