Tipo de red, tipo de variable, tipo de datos y objetos de datos

0

Estoy realmente confundido por la concepción del tipo de red, tipo de variable, tipo de datos y objetos de datos en SystemVerilog. Estoy usando el simulador dentro de Xilinx Vivado 2018.02 para todos los códigos siguientes.

logic en SystemVerilog puede sustituir parcialmente el rol de wire en Verilog. Digamos que tengo el siguiente código dentro de un módulo

logic q_bar;
logic q;
assign q_bar = ~q;
always_ff @(posedge clk or negedge rst) begin
    if(!rst)
        q <= 1'b0;
    else
        q <= q_bar;
end

¿El compilador infiere un tipo de red para q_bar ya que assign ed? q es de tipo variable ya que su asignación está en un bloque de procedimiento. Otro ejemplo:

typedef logic [7:0] mem_t[3:0][3:0];
typedef wire [7:0] byte_wire_t;

La primera línea es legal, pero el simulador se queja de la segunda: "Cable de palabra clave SystemVerilog utilizado en texto incorrecto". Pero la gramática de typedef es

typedef data_type type_identifier { variable_dimension } ;
| typedef [ enum | struct | union | class | interface class ] type_identifier ;
...

¿No es wire un tipo de datos? ¿El tipo de red es un tipo de datos?

    
pregunta Harold H.

1 respuesta

5

No wire no es un tipo de datos ; es un tipo de red . SystemVerilog tiene una confusa configuración implícita de valores predeterminados para ser compatible con versiones anteriores de Verilog.

Cuando escriba lo siguiente en Verilog:

wire w;

es lo mismo que sigue en SystemVerilog:

wire logic w;

Esto significa que w es una red con un tipo de datos de 4 estados (0,1, x o z). Y el wire tipo de net significa que puede tener múltiples controladores con diferentes fortalezas. Cuando hay estados en conflicto con la misma fuerza, la red se resuelve en el estado X. Otros tipos de tipos de red usan AND u OR para resolver conflictos. Los tipos de red no pueden tener asignaciones de procedimiento.

Cuando escribe la siguiente declaración en Verilog:

logic v;

es lo mismo que esta declaración siguiente en SystemVerilog:

var logic v;

Esto significa que v es una variable con un tipo de datos de 4 estados (0,1, x o z). Y ser una variable significa que solo se le permite tener una asignación continua, o cualquier número de asignaciones de procedimiento. No puede tener ambos tipos de tareas.

Si una variable se sintetiza en un Registro / flop o un cable metálico físico depende de su uso.

También puede leer enlace

Por cierto, hay pequeñas diferencias en los valores predeterminados para las declaraciones de puertos del módulo. Por ejemplo, (input logic w) por defecto es wire tipo de red , no una variable.

    
respondido por el dave_59

Lea otras preguntas en las etiquetas