Quartus编译Verilog CPU遇Error 12006:未定义实体实例化问题
Quartus 21.1.1编译Verilog CPU时Error 12006问题排查与解决
问题描述
在Windows 10系统使用Quartus 21.1.1编译Verilog-2001编写的CPU时,已修复system.v中clk_out大小写冲突问题(改为clk_out_lower),但仍触发Error 12006:
- 节点实例"ibuf"实例化未定义实体"IBUFGDS"
- 节点实例"obuf"实例化未定义实体"BUFG"
- 节点实例"fbuf"实例化未定义实体"BUFG"
- 节点实例"mmcm"实例化未定义实体"MMCME2_ADV"
相关模块仅在system.v中引用,顶层实体为top.v,核心代码如下:
`default_nettype none `include "define.v" module CLKGEN_DCM(CLK_IN, CLK_OUT, LOCKED); input wire CLK_IN; output wire CLK_OUT, LOCKED; wire clk_ibuf; wire clk_out_lower; wire clk0, clk0_fbuf; // input buffer IBUFG ibuf (.I(CLK_IN), .O(clk_ibuf)); // output buffer BUFG obuf (.I(clk_out_lower), .O(CLK_OUT)); // feedback buffer BUFG fbuf (.I(clk0), .O(clk0_fbuf)); // dcm instantiation DCM_SP dcm (// input .CLKIN (clk_ibuf), .RST (1'b0), // output .CLKFX (clk_out_lower), .LOCKED (LOCKED), // feedback .CLK0 (clk0), .CLKFB (clk0_fbuf), // phase shift .PSEN (1'b0), .PSINCDEC(1'b0), .PSCLK (1'b0), // digital spread spectrum .DSSEN (1'b0)); defparam dcm.CLKIN_PERIOD = `DCM_CLKIN_PERIOD; defparam dcm.CLKFX_MULTIPLY = `DCM_CLKFX_MULTIPLY; defparam dcm.CLKFX_DIVIDE = `DCM_CLKFX_DIVIDE; endmodule /**************************************************************************************************/ module CLKGEN_MMCM(CLK_IN, CLK_OUT, LOCKED); input wire CLK_IN; output wire CLK_OUT, LOCKED; wire clk_out_lower; wire clkfb, clkfb_fbuf; // output buffer BUFG obuf (.I(clk_out_lower), .O(CLK_OUT)); // feedback buffer BUFG fbuf (.I(clkfb), .O(clkfb_fbuf)); MMCME2_ADV mmcm (// input .CLKIN1 (CLK_IN), .CLKIN2 (1'b0), .CLKINSEL (1'b1), .RST (1'b0), .PWRDWN (1'b0), // output .CLKOUT0 (clk_out_lower), .CLKOUT0B (), .CLKOUT1 (), .CLKOUT1B (), .CLKOUT2 (), .CLKOUT2B (), .CLKOUT3 (), .CLKOUT3B (), .CLKOUT4 (), .CLKOUT5 (), .CLKOUT6 (), .LOCKED (LOCKED), // feedback .CLKFBOUT (clkfb), .CLKFBIN (clkfb_fbuf), .CLKFBOUTB (), // dynamic reconfiguration .DADDR (7'h0), .DI (16'h0), .DWE (1'b0), .DEN (1'b0), .DCLK (1'b0), .DO (), .DRDY (), // phase shift .PSCLK (1'b0), .PSEN (1'b0), .PSINCDEC (1'b0), .PSDONE (), // status .CLKINSTOPPED (), .CLKFBSTOPPED ()); defparam mmcm.CLKIN1_PERIOD = `MMCM_CLKIN1_PERIOD; defparam mmcm.CLKFBOUT_MULT_F = `MMCM_VCO_MULTIPLY; defparam mmcm.DIVCLK_DIVIDE = `MMCM_VCO_DIVIDE; defparam mmcm.CLKOUT0_DIVIDE_F = `MMCM_CLKOUT0_DIVIDE; defparam mmcm.CLKOUT1_DIVIDE = `MMCM_CLKOUT1_DIVIDE; endmodule /**************************************************************************************************/ module RSTGEN(CLK, RST_X_I, RST_X_O); input wire CLK, RST_X_I; output wire RST_X_O; reg [7:0] cnt; assign RST_X_O = cnt[7]; always @(posedge CLK or negedge RST_X_I) begin if (!RST_X_I) cnt <= 0; else if (~RST_X_O) cnt <= (cnt + 1'b1); end endmodule /**************************************************************************************************/ module GEN_DCM(CLK_I, RST_X_I, CLK_O, RST_X_O); input wire CLK_I, RST_X_I; output wire CLK_O, RST_X_O; wire LOCKED; CLKGEN_DCM clkgen(.CLK_IN (CLK_I), .CLK_OUT(CLK_O), .LOCKED (LOCKED)); RSTGEN rstgen(.CLK (CLK_O), .RST_X_I(RST_X_I & LOCKED), .RST_X_O(RST_X_O)); endmodule module GEN_MMCM(CLK_I, RST_X_I, CLK_O, RST_X_O); input wire CLK_I, RST_X_I; output wire CLK_O, RST_X_O; wire clk_ibuf; wire LOCKED; // input buffer IBUFG ibuf (.I(CLK_I), .O(clk_ibuf)); CLKGEN_MMCM clkgen(.CLK_IN (clk_ibuf), .CLK_OUT(CLK_O), .LOCKED (LOCKED)); RSTGEN rstgen(.CLK (CLK_O), .RST_X_I(RST_X_I & LOCKED), .RST_X_O(RST_X_O)); endmodule module GEN_MMCM_DS(CLK_P, CLK_N, RST_X_I, CLK_O, RST_X_O); input wire CLK_P, CLK_N, RST_X_I; output wire CLK_O, RST_X_O; wire clk_ibuf; wire LOCKED; // input buffer IBUFGDS ibuf (.I (CLK_P), .IB(CLK_N), .O (clk_ibuf)); CLKGEN_MMCM clkgen(.CLK_IN (clk_ibuf), .CLK_OUT(CLK_O), .LOCKED (LOCKED)); RSTGEN rstgen(.CLK (CLK_O), .RST_X_I(RST_X_I & LOCKED), .RST_X_O(RST_X_O)); endmodule /**************************************************************************************************/ `default_nettype wire /**************************************************************************************************/
解决方法
1. 核心原因:混用FPGA厂商专属原语
IBUFGDS、BUFG、MMCME2_ADV、DCM_SP均为Xilinx FPGA专属的底层原语/模块,而Quartus是Intel(原Altera)FPGA的官方开发工具,无法识别Xilinx的专属模块,因此触发未定义实体错误。
2. 具体修复步骤
- 替换Xilinx原语为Intel对应模块:
- 输入缓冲(IBUFG/IBUFGDS):替换为Intel的
ALT_INBUF(单端)或ALT_INBUF_DIFF(差分)原语,或依赖Quartus自动推断输入缓冲 - 全局时钟缓冲(BUFG):替换为Intel的
GLOBAL_BUFFER原语,或让Quartus自动处理全局时钟布线 - 时钟管理模块(MMCME2_ADV/DCM_SP):替换为Intel的
ALTPLL或ALTERA_PLLIP核,通过Quartus IP Catalog生成配置好的PLL模块,替代手动实例化Xilinx MMCM/DCM
- 输入缓冲(IBUFG/IBUFGDS):替换为Intel的
- 确认项目器件配置:打开Quartus,进入
Assignments > Device,确保已正确选择目标Intel FPGA型号 - 重构时钟生成逻辑:若原代码针对Xilinx器件设计,需重新编写时钟生成模块适配Intel FPGA架构,例如调整
CLKGEN_MMCM模块接口与Quartus生成的PLL IP匹配
内容的提问来源于stack exchange,提问作者Satoshi921
相关产品推荐
相关产品推荐

