Verilog del sistema: definir vector vacío

0

En VHDL puedo escribir (0 downto 1) y generaré un Vector con 0 elementos.

Quiero hacer esto para "alinear a la derecha" un campo en una unión, si es necesario. Samplecode:

module example #(int ITEMS=3)(output logic[4:0] result);
union {
  logic [4:0] result;
  struct {
    logic systemstatus;
    logic [4-1-ITEMS-1:0] padding;
    logic [ITEMS-1:0] itemStatus;
  } bitfield;
} myStruct;
endmodule;

Quiero generar una estructura que se parece aproximadamente a esto:

systemstatus | 0padder | item3 | item2 | item1 //ITEMS==3
systemstatus | item4   | item3 | item2 | item1 //ITEMS==4

Como puede ver, el campo de relleno desaparece para 4 elementos. Sin embargo, el código anterior no hará lo que quiero en el sistema verilog, ya que en lugar de crear un vector con 0 elementos, siempre crearé un vector con al menos un elemento ( [0:0] ), y cuando la expresión se vuelva negativa ( [-1:0]] ) Crearé un vector con dos elementos.

¿Hay una manera de dejar a padding "decaimiento / degeneración" en un vector vacío? Sé que podría hacer que myStruct.bitfield.itemStatus simplemente tenga el tamaño correcto y siempre tenga acceso a un subvector. Pero el punto es hacer la magia una vez en la estructura y no preocuparse más por el resto del código.

    
pregunta ted

1 respuesta

2

Desea utilizar la instrucción let en lugar de un union . La instrucción let es como una macro, excepto que se limita a un ámbito y se limita mediante la sustitución de expresiones, no por cualquier texto arbitrario.

module example #(int ITEMS=3)(output logic[4:0] result);
  let systemstatus = result[4];
  let itemStatus = result[ITEMS-1:0];
  ...
endmodule

Si aún desea hacer esto usando una unión, puede obtener lo que desea al crear su unión con dos estructuras. También tenga en cuenta que debe utilizar una unión y estructura empaquetadas para garantizar la alineación de los bits.

union packed {
  logic [4:0] result;
  struct packed {
    logic status;
    logic [3:0] padding;
  } system;
  struct packed {
    logic [4: 1+4-ITEMS] padding;
    logic [ITEMS-1:0] status;
  } item;
} myStruct; 

Ahora puedes referirte a mystruct.system.status y mystruct.item.status .

    
respondido por el dave_59

Lea otras preguntas en las etiquetas