Pregunta

(inserte aquí el descargo de responsabilidad de la pregunta realmente básica)

Más específicamente, tengo la siguiente declaración:

output reg icache_ram_rw

Y en algún punto del código necesito poner el valor cero en este registro. Esto es lo que he intentado y los resultados:

assign icache_ram_rw = 1'b0;
( declarative lvalue or port sink reg icache_ram_rw must be a wire )

icache_ram_rw <= 1'b0;
( instance gate/name for type "icache_ram_rw" expected - <= read )

¡¿Cómo lo hago después de todo ?!

¿Fue útil?

Solución

La declaración asignar se usa para conducir wire s.

Si has declarado algo como reg , debes asignarle valores dentro de un procedimiento ( siempre o inicial ) . Se recomienda establecer solo los valores de reg en el mismo bloque siempre . por ejemplo:

always @( * ) begin // combo logic block
   if( some_condition ) begin
      icache_ram_rw = 1'b0;
   end else begin
      icache_ram_rw = something_else;
 end

Hay diferencias importantes entre reg s y wire que debe leer.

Sin embargo, tengo la sensación de que necesitarás algo de lógica cronometrada si estás manejando señales de RAM. En este caso, necesitará un código que se parezca a esto:

// some parameter definitions to make logic 'read' clearer.
localparam READ = 1'b0; 
localparam WRITE = 1'b1;

// standard clocked logic 'template' that synthesis tools recognise.
always @( posedge clk or negedge resetb )
  if( !resetb ) begin  // asynchronous active low reset
     icache_ram_rw <= READ;
  end else if( some_enable_condition ) begin
     icache_ram_rw <= WRITE;
  end else begin
     icache_ram_rw <= READ;
  end

Otros consejos

Eliminar " reg " a partir de la declaración de salida y el código debería funcionar (por defecto al tipo de salida de cable).

Hay dos cosas que la mayoría de los ingenieros autodidactas o con poca enseñanza encuentran difíciles de entender en Verilog: (1) bloqueo de asignaciones no bloqueantes -vs (vea mi artículo sobre este tema: http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf ) y (2) reg -vs- wire. Aclaremos el último tema ahora mismo.

Cualquier cosa en el lado izquierdo (LHS) o una asignación de procedimiento (siempre, inicial, tarea, función) debe ser declarada como un tipo de variable (típicamente un registro). Todo lo demás en el idioma es una red (típicamente un cable). Sin excepciones. Es realmente tan simple. No conozco ningún libro de Verilog que lo diga de manera simple.

¿Cómo sucedió esto? Le pregunté a Phil Moorby, buen amigo e inventor del lenguaje Verilog, "¿por qué reg?" Phil me dijo que cuando inventó Verilog, no había herramientas de síntesis y pensó que todo lo que saliera de un bloque siempre sería un registro. Estaba equivocado, y ahora estamos atrapados con este " reg " palabra clave.

Durante más de una década, he tratado de cambiar esto en los comités de Veirlog y SystemVerilog. Me gustaría declarar todo como cable y el primer uso determinaría si " cable " se comporta como un registro (la primera asignación de un bloque de procedimiento y la última asignación gana) o se comporta como un cable (la primera asignación es de una fuente de activación, como la salida de un módulo o la asignación continua, y los controladores múltiples se resuelven como en Verilog hoy) y Ser ilegal hacer asignaciones de procedimiento y asignaciones de conductor a la misma señal. Lamentablemente, no he tenido suficientes votos en el comité para aprobar esta propuesta.

Este es el error que cometo con mayor frecuencia en mi propio código. Solo se acostumbra a los mensajes de error como, " asignación LHS ilegal " o " asignación ilegal a cable " Ambos significan lo mismo, se te olvidó declarar tus registros.

Saludos - Cliff Cummings - Verilog & amp; SystemVerilog Guru

Tenga en cuenta que también puede asignar un valor inicial a un registro cuando lo declara, como este:

output reg icache_ram_rw = 1'b0;

Esto asegurará que comience con el valor cero en la simulación. Para la síntesis, sus resultados dependerán de la herramienta de síntesis y la tecnología de destino (para los FPGA, generalmente puede asignar un valor inicial para el hardware; para ASIC, ese no es el caso).

  1. el problema es que la declaración de asignación cuando se sintetiza creará el puerto / pin, por eso es necesario un cable como salida.
  2. ha creado el registro denominado icache_ram_rw ahora un registro no es lo mismo que el pin derecho ...
  3. para asignar un registro, debe usar un formato adecuado de verilog
  4. verilog permite lo mismo usando la instrucción always, se crea un DFF y el pin de entrada de ese DFF sería su icache_ram_rw, el formato ya lo proporcionaron otros.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top