Interfaz del adaptador Verilog del sistema

0

Estoy utilizando PCIe Core de Xilinx, que en su última versión duplica la señal válida de AXI 22 veces. Esto significa escribir algo como {22{1'b1}} cada vez que intento manejar un bit válido. ( enlace )

Me pregunto si puedo hacer algo de magia, así que tengo una interfaz que tiene un vector con 22 bits duplicados en el lado del Núcleo PCIe de Xilinx, pero solo un bit en el lado al que me conecto.

Aunque puedo simplemente asignar un cable que duplico en mi módulo, me encantaría saber si puedo lograr lo mismo dentro de la interfaz.

¿Es legal tener modports que no incluyan todos los cables de una interfaz (de esa manera podría tener un pin válido para el modportide del lado del usuario y el Vector para el lado central)? ¿Se pueden tener asignaciones en una interfaz? ¿O podría hacer algo de magic para provocar que una escritura a un miembro de una unión resulte en actualizaciones de otros miembros de la unión que no comparten bits?

    
pregunta ted

1 respuesta

1
  

¿Es legal tener modports que no incluyan todos los cables de una interfaz?

Sí, consulte IEEE Std 1800-2012 § 25.5.4 Modport expresiones :

  

Una expresión modport permite que elementos de matrices y estructuras, concatenaciones de elementos y expresiones de patrones de asignación de elementos declarados en una interfaz se incluyan en una lista modport. Esta expresión modport se nombra explícitamente con un identificador de puerto, visible solo a través de la conexión modport.

  Al igual que los puertos nombrados explícitamente en una declaración de puerto de módulo, los identificadores de puerto existen en su propio espacio de nombre para cada lista de puerto de puerto. Cuando un ítem modport es solo un identificador de puerto simple, ese identificador se usa como una referencia a un ítem de interfaz y un identificador de puerto. Una vez que se haya definido un identificador de puerto, no habrá otra definición de puerto con este mismo nombre.

  Por ejemplo:

interface I;
  logic [7:0] r;
  const int x=1;
  bit R;
  modport A (output .P(r[3:0]), input .Q(x), R);
  modport B (output .P(r[7:4]), input .Q(2), R);
endinterface
module M ( interface i);
  initial i.P = i.Q;
endmodule
module top;
  I i1 ();
  M u1 (i1.A);
  M u2 (i1.B);
  initial #1 $display("%b", i1.r); // displays 00100001
endmodule

No todos los simuladores / sintetizador admiten expresiones modeport, por lo que tendrás que experimentar. Las expresiones de Modeport no son nuevas, también se describen en IEEE Std 1800-2005. Quizás también el Accellera SystemVerilog 3.1a (necesitaría desenterrar el antiguo LRM para verificar).

  

¿Se pueden tener asignaciones en una interfaz?

Sí. El soporte de síntesis puede estar limitado para algunas herramientas; tendrás que experimentar. Para las simulaciones, las declaraciones de asignación en una interfaz se pueden usar para controlar datos para buses de tres estados.

interface I;
  bit drive_en;
  tri [15:0] io;
  logic [15:0] io_drv;
  assign io = drive_en ? io_drv : 'z;
endinterface

Las interfaces también pueden contener sus propias tareas y funciones. Si está usando la interfaz para el diseño, entonces generalmente desea limitar la interfaz simple: principalmente señales y puertos. Esto no es una regla, solo una guía recomendada.

  

¿O podría hacer algo de magic para provocar que una escritura a un miembro de una unión resulte en actualizaciones de otros miembros de la unión que no comparten bits?

Más poder para ti si obtienes el magic para lograrlo. Probablemente no valga la pena el esfuerzo.

    
respondido por el Greg

Lea otras preguntas en las etiquetas