You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_PLL IP核,通过Quartus IP Catalog生成配置好的PLL模块,替代手动实例化Xilinx MMCM/DCM
  • 确认项目器件配置:打开Quartus,进入Assignments > Device,确保已正确选择目标Intel FPGA型号
  • 重构时钟生成逻辑:若原代码针对Xilinx器件设计,需重新编写时钟生成模块适配Intel FPGA架构,例如调整CLKGEN_MMCM模块接口与Quartus生成的PLL IP匹配

内容的提问来源于stack exchange,提问作者Satoshi921

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 00:31:17