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

VHDL如何通过外部名称引用generic 解决仿真ELAB2_0127错误

问题描述

层级结构中较低位置的模块带有整数类型generics,需要在testbench中使用VHDL的force命令覆盖这段自动生成代码内部的generic值,操作时仿真器抛出如下错误:

ELAB2: Fatal Error: ELAB2_0127 W_PROBE_FPGA.vhd (136): Incorrect object class for external name: '<<probe_fpga_inst.SPRINT_PROBE_TOP_LEVEL_0.SYNTHESIZE_ACCELERATION_DAQ>>'.

已尝试代码:

alias SYNTHESIZE_ACCELERATION_DAQ is <<signal probe_fpga_inst.SPRINT_PROBE_TOP_LEVEL_0.SYNTHESIZE_ACCELERATION_DAQ : integer>>;

先后将关键字替换为signal、variable、constant,也试过留空,均未生效。

解决方案
  • Generic属于常量类对象,旧版本主流仿真器不支持通过外部名称直接引用内部generic,你可以优先使用仿真器elaboration阶段的参数覆盖功能绕过该限制,以Vivado仿真器为例,在elaboration环节添加如下参数即可直接修改指定层级的generic值:
    -generic_top probe_fpga_inst.SPRINT_PROBE_TOP_LEVEL_0.SYNTHESIZE_ACCELERATION_DAQ=你需要的数值
    
    Questa/Modelsim的对应参数为-G,用法为-G<完整generic路径>=<数值>。
  • 如果你使用2021年之后更新的新版本仿真器(Xcelium 22.03+、Vivado Simulator 2022.1+、Questa 2021.3+),已经支持对内部generic的外部名称引用,正确的别名定义语法为:
    alias SYNTHESIZE_ACCELERATION_DAQ is <<constant probe_fpga_inst.SPRINT_PROBE_TOP_LEVEL_0.SYNTHESIZE_ACCELERATION_DAQ : integer>>;
    
    注意修改时需要在仿真启动的elaboration阶段完成赋值,不要等到运行阶段调用force命令修改,generic的数值在elaboration完成后默认是锁定不可修改的,部分仿真器需要额外开启参数-allow_constant_force才支持force修改常量类对象。
  • 如果上述方案都不生效,你可以修改自动生成代码的生成脚本,将需要修改的generic向上逐层传递到顶层模块,在testbench例化顶层模块时直接传入自定义值,不需要使用force命令修改内部节点,兼容性最好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 12:45:03