Declarar números firmados en Verilog

1

Hay tantos recursos en línea que hablan sobre cómo representar y extender los números firmados en Verilog, pero todavía no puedo obtenerlos. Digamos que tengo un número 244, que es 'b1111_0100, o' hF4. Si quiero representar este número en decimal firmado, ¿debo declarar el tamaño con un bit adicional para el signo?

8'sd244 or 9'sd244               // signed 244?
8'sb1111_0100 or 9'sb1111_0100   // which one is correct 244?
8'shF4    or 9'shf4              // Do I need 0FA, or it is assumed?

Aún más confusión viene con números negativos: ¿necesito representarlos en el formato de complemento a 2? ¿Qué tal el tamaño? Sería bueno si alguien pudiera dar una explicación con un ejemplo en el formato <size>'<signed><format><value> .

    
pregunta Nazar

3 respuestas

1

Para declarar un número negativo en el formulario de complemento a 2, coloque el signo negativo delante de el especificador de ancho, por ejemplo

-8'H10

Sería el valor de -16, y tendría el mismo patrón de bits que el valor sin signo 8'HF0

De hecho, debe incluir el bit de signo en sus consideraciones de ancho, y, por supuesto, depende de usted realizar un seguimiento de qué vectores deben interpretarse como firmados y cuáles como no firmados.

    
respondido por el Chris Stratton
1

Debe separar el valor del patrón de bits expresado por un literal numérico del tipo con signo o sin signo . La firma solo entra en juego cuando un valor se usa en otra expresión, y también determina los valores mínimo / máximo interpretados. Las partes <size> , <radix> y <value> de un literal le dan un patrón de bits sin signo. Si está trabajando con una expresión de 8 bits, el mayor valor firmado que puede representar es 127.

Entonces, si tienes 8'sd244, eso se interpretará como un número negativo firmado (-11, creo). Si intenta representar -244, necesita al menos un valor de ancho de 9 bits. Verilog tiene reglas difíciles cuando se mezclan tipos de datos firmados y no firmados. Pero en general, el MSB de una expresión firmada se extiende con signo cuando se usa en una expresión firmada de ancho mayor.

    
respondido por el dave_59
0

Para representar números firmados, definitivamente necesita 1 bit extra, como si +250 en unsigned se pudiera representar en 8 bits, pero ambos +250 y -250 cuando se declaren unsigned necesitarían 9 bits.

Puedes probar este pequeño programa y verte a ti mismo

'timescale 1ns/1ps

module tb;
  reg signed [8:0] a;
  reg [7:0] b;

  initial
    begin
      a = 9'b011111010;
      b = 8'b11111010;
      $display("a is %d and b is %d", a, b);
      a = 9'b100000110;
      b = ~b + 1;
      $display("a is %d and b is %d", a, b);
    end
endmodule

Entonces, +250 cuando se representa en 8 bits (sin firmar), si se hace el complemento de 2 no produce -250. Para obtener -250, necesitas 9 bits y eso cuando se complementa con 2 produce -250 correctamente.

So 9'sb011111010 = +250
   9'sb100000110 = -250
   8'ub11111010   = +250
    
respondido por el Shankhadeep Mukerji

Lea otras preguntas en las etiquetas