Vivado构建已实现设计时从何处引用原语?BRAM属性修改为何失效
Vivado实现流程中原语属性引用规则与Artix-7 BRAM属性修改方法
- Vivado实现阶段的原语属性并非从可手动编辑的原语HDL模型文件读取,Artix-7所属7系列器件的所有原语强制属性、合法取值范围都硬编码在Vivado安装目录下的器件数据库二进制包中(路径为
data/parts/xc7a/相关库文件)。手动修改安装目录下的原语仿真模型、工程运行时自动生成的临时网表/缓存文件,只要执行综合优化、布局、布线步骤,工具会自动将原语属性与器件数据库的规则做校验,被删除或修改为非法值的属性会被自动回填为默认值,这也是修改关联文件后属性自动恢复的核心原因。 - 工程中实例化的BRAM原语(包括
RAMB36E1、RAMB18E1)会在两个阶段被工具校验属性:一是综合阶段的opt_design步骤,二是实现阶段布局前的网表优化步骤,所有不符合器件硬件规则的属性修改都会被直接重置。 - 要稳定修改BRAM属性且不被流程覆盖,需通过工具认可的合法路径设置,禁止修改安装目录文件、工程实现目录下的自动生成文件:
- RTL直接例化原语的场景:在综合前的RTL代码中,直接在原语例化块内显式声明目标参数,通过例化参数赋值或
defparam写入需要的配置值,只要参数取值在Artix-7 BRAM支持的合法范围内,后续全流程都会保留该设置,不会被自动覆盖。 - 调用IP生成BRAM的场景:不要直接编辑IP生成的输出文件、网表文件,需打开Block Memory Generator等BRAM IP的自定义配置界面,在GUI中修改对应配置项后重新生成IP输出产物,再跑综合实现即可保留配置。
- 综合后网表修改BRAM属性的场景:在实现专属的XDC约束文件中添加属性设置命令,参考写法为
set_property [你的目标属性名] [目标属性值] [get_cells 对应BRAM单元的层级路径],约束文件需标记为仅用于实现阶段,避免被综合流程覆盖,同样要求设置的属性值在合法取值范围内。
- RTL直接例化原语的场景:在综合前的RTL代码中,直接在原语例化块内显式声明目标参数,通过例化参数赋值或
- 若需要修改的是工具默认强制添加、常规流程不允许用户修改的属性,需在实现流程中添加Tcl钩子(Hook):在每一步实现命令执行完成、工具启动属性校验前,通过脚本重新写入目标属性值,同时给对应BRAM单元加上
DONT_TOUCH=TRUE属性,避免后续优化步骤改动配置。
可在Vivado Tcl控制台执行
report_property [get_lib_cells RAMB36E1]命令,查询Artix-7系列BRAM原语所有支持的可配置属性、对应合法取值范围,不在返回列表中的属性、或超出取值范围的设置,无论通过什么方式修改都会被工具自动重置。
内容的提问来源于stack exchange,提问作者WaterStopperN
相关产品推荐
相关产品推荐

