Résolution de l'erreur de référence inter-modules (XMRE) liée au module glbl sous Verdi et VCS

L'erreur Error-[XMRE] (Cross-module reference resolution error) survient fréquemment lors de la simulation de primitives Xilinx, telles que OSERDESE2, avec des outils comme Verdi ou VCS. Cette erreur indique que le simulateur ne parvient pas à résoudre une référence croisée, spécifiquement l'appel à glbl.GSR.

Dans l'écosystème Xilinx, le module glbl est un composant fondamental qui génère les signaux globaux de simulation, notamment le reset global (GSR) et le contrôle global des états de haute impédance (GTS). Si ce module n'est pas explicitement compilé et lié lors de l'élaboration, les primitives internes échouent à trouver ces signaux, déclenchant l'erreur XMRE.

Pour corriegr ce problème, il est nécessaire de fournir une implémentation du module glbl et de l'intégrer correctement dans le flux de compilation. Voici une version restructurée du fichier glbl.v avec une nomenclature enterne modernisée, tout en conservant les noms de signaux externes imposés par les primitives Xilinx :

`ifndef GLOBAL_SIGNALS_MODULE
`define GLOBAL_SIGNALS_MODULE
`timescale 1ps / 1ps

module glbl ();

    parameter RESET_DELAY = 100000;
    parameter TRISTATE_DELAY = 0;

    // Signaux globaux de démarrage
    wire GSR;
    wire GTS;
    wire GWE;
    wire PRLD;
    tri1 pll_lock_pullup;
    tri (weak1, strong0) PLL_LOCKG = pll_lock_pullup;

    wire PROGB_GLBL;
    wire CCLKO_GLBL;
    wire FCSBO_GLBL;
    wire [3:0] DO_GLBL;
    wire [3:0] DI_GLBL;
   
    reg global_reset_reg;
    reg global_tristate_reg;
    reg preload_reg;

    // Signaux globaux JTAG
    wire JTAG_TDO_GLBL;
    wire JTAG_TCK_GLBL;
    wire JTAG_TDI_GLBL;
    wire JTAG_TMS_GLBL;
    wire JTAG_TRST_GLBL;

    reg JTAG_CAPTURE_GLBL;
    reg JTAG_RESET_GLBL;
    reg JTAG_SHIFT_GLBL;
    reg JTAG_UPDATE_GLBL;
    reg JTAG_RUNTEST_GLBL;

    reg JTAG_SEL1_GLBL = 0;
    reg JTAG_SEL2_GLBL = 0;
    reg JTAG_SEL3_GLBL = 0;
    reg JTAG_SEL4_GLBL = 0;

    reg JTAG_USER_TDO1_GLBL = 1'bz;
    reg JTAG_USER_TDO2_GLBL = 1'bz;
    reg JTAG_USER_TDO3_GLBL = 1'bz;
    reg JTAG_USER_TDO4_GLBL = 1'bz;

    assign (strong1, weak0) GSR = global_reset_reg;
    assign (strong1, weak0) GTS = global_tristate_reg;
    assign (weak1, weak0) PRLD = preload_reg;

    initial begin
        global_reset_reg = 1'b1;
        preload_reg = 1'b1;
        #(RESET_DELAY);
        global_reset_reg = 1'b0;
        preload_reg = 1'b0;
    end

    initial begin
        global_tristate_reg = 1'b1;
        #(TRISTATE_DELAY);
        global_tristate_reg = 1'b0;
    end

endmodule
`endif

Une fois le fichier sauvegardé, le flux de compilation doit être mis à jour. La première étape consiste à analyser ce fichier avec vlogan et à le compiler dans la bibliothèque par défaut de Xilinx. Voici comment restructurer la cible de compilation dans votre Makefile :

analyze_globals:
	vlogan \
	+v2k \
	-full64 \
	-work xil_defaultlib \
	"./chemin/vers/custom_glbl.v"

Ensuite, l'étape d'élaboration avec vcs doit être modifiée pour inclure explicitement le module glbl compilé dans la liste des modules de premier plan. L'ajout de xil_defaultlib.glbl assure que le simulateur lie correctement les signaux globaux :

build_simulation:
	vcs \
	-full64 \
	-sverilog \
	-Mdir=./sim_work/xil_defaultlib \
	-debug_access+all \
	$(debug_flags) \
	xil_defaultlib.${TOP_MODULE} xil_defaultlib.glbl \
	-o sim_exec \
	2>&1 | tee -a build.log

Ces ajustements garantissent que le module glbl est correctement analysé et lié, éliminant ainsi l'erreur de résolution de référence inter-modules lors du débogage sous Verdi.

Étiquettes: Verdi VCS Xilinx Vivado Verilog

Publié le 25 juillet à 15h50