EETOP 创芯网论坛 (原名:电子顶级开发网)
标题: 非顶层模块端口能否添加物理管脚约束 [打印本页]
作者: fengbohan1 时间: 2021-12-8 14:55
标题: 非顶层模块端口能否添加物理管脚约束
本帖最后由 fengbohan1 于 2021-12-8 23:45 编辑
我在设计中调用了xilinx的DDR4 ip,所以我需要把DDR控制器和芯片相关的接口一层一层引出到顶层端口然后才能添加约束。我想知道能否直接在IP的约束文件里面直接将对应的端口约束到指定管脚,这样我就不用层层引出了。
我现在尝试的用don't touch 保留net,然后在net上设置约束行不通,报错。
( , 下载次数:
83 )
还有其他的方法吗?
作者: innovation 时间: 2021-12-8 18:45
本帖最后由 innovation 于 2021-12-8 18:58 编辑
你是想这样干?一个IP,你例化(调用)时的层次比较深,然后这个IP有一部分端口(信号)你在RTL代码中不一层一层的连接到顶层模块?
如果是这个想法,我估计比较难吧,这基本相当于修改了FPGA IP例化的基本流程。。。
补充一点:IP例化时,部分端口不连接,IP内部的部分相关逻辑甚至会被优化掉,所以,如果你的想法就是我问的那样,我总感觉这个需求跟FPGA多年来的一些基本流程、规矩有点儿冲突?
作者: fengbohan1 时间: 2021-12-8 22:24
本帖最后由 fengbohan1 于 2021-12-8 22:28 编辑
确实不可以通过约束实现。但是我找到一种方法可以通过TCL修改综合的网表实现,当调用的层级很深时可以使用这种方法。大致流程如下,其中的IP使用OOC模式综合的,非OOC模式下会不会出现你说的被优化掉的情况我还没有测试。
- 代码中利用(* keep = “true” )避免优化,不能用( dont_touch = “yes” *),dont_touch会导致不能修改网表。
- 创建端口
- 创建BUFER
- 连接net
- 生成位流
我是用的tcl脚本如下
- # 创建端口
- create_port -direction IN -diff_pair sys_clk_p sys_clk_n
- create_port -direction IN rst
- #创建输入BUF,因为时钟输入直接引到PLL上了所以不用加BUF了
- create_cell -reference IBUF rst_IBUF_inst
- #创建net
- create_net rst_net
- #移除 图中wrapper里面的3个lut
- remove_cell design_1_wrapper_i/i_0
- remove_cell design_1_wrapper_i/i_1
- remove_cell design_1_wrapper_i/i_2
- #连接 net
- connect_net -net rst_net -objects [get_ports rst]
- connect_net -net rst_net -objects rst_IBUF_inst/I
- connect_net -hier -net design_1_wrapper_i/reset_0 -objects rst_IBUF_inst/O
- connect_net -hier -net design_1_wrapper_i/CLK_IN1_D_0_clk_p -objects [get_ports sys_clk_p]
- connect_net -hier -net design_1_wrapper_i/CLK_IN1_D_0_clk_n -objects [get_ports sys_clk_n]
- #约束端口,新的端口只能在创建后进行约束
- set_property IOSTANDARD DIFF_SSTL12 [get_ports sys_clk_p]
- set_property IOSTANDARD DIFF_SSTL12 [get_ports sys_clk_n]
- set_property PACKAGE_PIN G31 [get_ports sys_clk_p]
- set_property PACKAGE_PIN F31 [get_ports sys_clk_n]
- set_property IOSTANDARD LVCMOS12 [get_ports rst]
- set_property PACKAGE_PIN L19 [get_ports rst]
复制代码
( , 下载次数:
80 )
作者: fengbohan1 时间: 2021-12-8 22:25
更加具体的过程我写到我的博客里面了。
模块深层调用-使用TCL修改网表避免层层穿出
作者: fengbohan1 时间: 2021-12-8 22:49
使用约束确实不行,但是我想到一种方法,可以用TCL修改综合后的网表来解决深层调用层层穿出的问题。
我这个示例工程里面IP用的是OOC模式综合的,非OOC模式下会不会出现你说的逻辑被优化问题我还没有测试。
具体流程如下:
- 代码中利用(* keep = “true” )避免优化,不能用( dont_touch = “yes” *),dont_touch会导致不能修改网表。
- 创建端口
- 创建BUFER
- 连接net
- 生成位流
- # 创建端口
- create_port -direction IN -diff_pair sys_clk_p sys_clk_n
- create_port -direction IN rst
- #创建输入BUF,因为时钟输入直接引到PLL上了所以不用加BUF了
- create_cell -reference IBUF rst_IBUF_inst
- #创建net
- create_net rst_net
- #移除 图中wrapper里面的3个lut
- remove_cell design_1_wrapper_i/i_0
- remove_cell design_1_wrapper_i/i_1
- remove_cell design_1_wrapper_i/i_2
- #连接 net
- connect_net -net rst_net -objects [get_ports rst]
- connect_net -net rst_net -objects rst_IBUF_inst/I
- connect_net -hier -net design_1_wrapper_i/reset_0 -objects rst_IBUF_inst/O
- connect_net -hier -net design_1_wrapper_i/CLK_IN1_D_0_clk_p -objects [get_ports sys_clk_p]
- connect_net -hier -net design_1_wrapper_i/CLK_IN1_D_0_clk_n -objects [get_ports sys_clk_n]
- #约束端口,新的端口只能在创建后进行约束
- set_property IOSTANDARD DIFF_SSTL12 [get_ports sys_clk_p]
- set_property IOSTANDARD DIFF_SSTL12 [get_ports sys_clk_n]
- set_property PACKAGE_PIN G31 [get_ports sys_clk_p]
- set_property PACKAGE_PIN F31 [get_ports sys_clk_n]
- set_property IOSTANDARD LVCMOS12 [get_ports rst]
- set_property PACKAGE_PIN L19 [get_ports rst]
复制代码
作者: innovation 时间: 2021-12-8 23:07
博客已经拜读,写得非常棒!!!(
eetop没有点赞的图标吗?还是我等级不够所以没有?) 正所谓“活到老,学到老,古人诚不欺我!”
回到问题的本质,两种方法解决同一个问题?
RTL代码层层连接,工具软件编译生成网表↘
→ 对网表添加约束?
TCL脚本修改网表↗
作者: fengbohan1 时间: 2021-12-9 12:11
本帖最后由 fengbohan1 于 2021-12-9 12:21 编辑
我认为你说的对,二者最终得到的都是网表。另外我测试了一下非OOC模式,原理图如图
( , 下载次数:
92 )
对比OOC模式下的原理图
( , 下载次数:
80 )
逻辑还是被优化了。
参考UG901 p55页对keep的解释
( , 下载次数:
90 )
keep能保留对应的信号但是该信号不会驱动任何东西。
参考UG901 P48页对dont_touch的解释,dont_touch可以forward-annotated to place and route阻止相关的逻辑被优化。
( , 下载次数:
78 )
但是用dont_touch就不能tcl修改对应的网表。非OOC模式下这个方法暂时还是不行。
只能建议对要层层穿出的模块使用OOC模式综合。然后再用TCL修改网表。
作者: innovation 时间: 2021-12-9 13:44
( , 下载次数:
91 )
( , 下载次数:
76 )
( , 下载次数:
82 )
( , 下载次数:
84 )
( , 下载次数:
81 )
( , 下载次数:
84 )
作者: smarthb 时间: 2021-12-9 17:26
厉害啊
作者: fengbohan1 时间: 2021-12-9 22:08
本帖最后由 fengbohan1 于 2021-12-9 22:11 编辑
真是大开眼界,xilinx论坛官方给了一个更好的方法。推荐使用这个方法,我上面的回答随便看看就好了。
下面是复制的回答:
在代码侧可以使用hierarchical naming的方式把底层的管脚直接接到顶层,而无需层层改接口.
Ex:
模块层次clkx_pre_i0/meta_harden_bus_new_i0 , Pin:signal_dst
output my_output,
...
assign my_output = clkx_pre_i0.meta_harden_bus_new_i0.signal_dst;
底层的端口如果是输入,只能悬空,否则会形成多驱动.
如果是输出,可以悬空,也可以连接驱动其他信号.
的确,一般不建议这么写,读底层代码时容易忘记顶层还有连接,可以加注释提醒自己.
作者: fengbohan1 时间: 2021-12-9 22:14
可以看看,我置顶的回答。xilinx论坛官方给了一个更好的方法。
作者: fengbohan1 时间: 2021-12-9 22:14
可以看看,我置顶的回答。xilinx论坛官方给了一个更好的方法。
欢迎光临 EETOP 创芯网论坛 (原名:电子顶级开发网) (https://bbs.eetop.cn/) |
Powered by Discuz! X3.5 |