转载自http://blog.sina.com.cn/s/blog_8a5e03d50102vgn1.html
——————————————————————————————————————————————
因为后端布局布线工具,很难读取包含tri wires ,tran 源语,assign语句的网表。因此要求我们在生成网表的时候尽可能消除assign语句。DC综合时在什么情况下会出现assign语句呢。
1、block的port如果是inout信号,DC产生tri wire 语句和tran 源语。(网表中包括三态元素),rtl代码中出现一个信号,驱动两个output的port时。
2、当设计中出现同一模块input port和output port直接相连(feedthrough)。
3、 output port连结到ground或被一常数(1‘b0,0’b0)驱动,DC都会在网表中产生assign语句。
怎么消除呢?
1、第一种情况,通过设置set verilogout_no_tri=true,使DC 将tri_state net宣称为wire。
2、第二种情况和第三种情况,这样block内的feedthrough问题会被修正,inpu和output之间插buffer去修正。可以通过设置,
set_fix_mulitple_port_nets -feedthrough
sset_fix_multiple_port_nets -all -buffer_constants
3、如果以上处理都不能解决问题。则设计中可能存在具有dont_touch属性的net,可用如下命令将net的dont_touch移去。
remove_attribute find(net,) dont_touch
define_name_rules MY_RULES -equal_ports_nets
change_name -hier -rules MY_RULES -verbose
Question:
问题:I have a feedthrough in my circuit, and the netlist is showing an assign statement for this feedthrough.
我的电路设计中有端口直接连接,综合后网表中使用assign语句用于此连接。
How can I remove the assign statement from the netlist?;
我如何去除网表中的assign语句?
Answer:
回答:The two most common reasons for assign statements to appear in a gate-level netlist are
两个最可能的原因会造成在门级网表中出现assign语句:
(1) there are feedthroughs that connect multiple ports on a single net or
一条网络上连接多个端口,或者
(2) the netlist contains three-state elements
网表中包括三态元素。
Feedthrough
Nets直接连接网络
HDL Compiler creates assign statements in the design when two ports are connected without logicbetween them. If a feedthrough has an output port connected to an input port without any logic inbetween, it causes Design Compiler to add the assign statement in the netlist. Design Compiler isunable to represent such connections without using nonstructural artifacts such as the assignstatement.
当设计中两个端口之间没有逻辑直接相连时,HDL编译器会用assign语句。如果从输入端口到输出端口的连接中间没有逻辑,DC编译器会在网表中加入assign语句。不用assign语句,DC将不会表达这种连接。
To fix this problem, you need to add logic to the design to correctly represent the otherwiseunrepresentable connections. To fix the feedthrough in the design, use this command before compile:
要修复此问题,你需要增加逻辑正确表达这种连接。要修复设计中端口直接连接,在编译前使用如下命令:
set_fix_multiple_port_nets -all -buffer_constants
Design Compiler will then insert logic into the design to prevent ports from being connected to thesame net.
DC编译器会插入逻辑以避免设计中多个端口连接到同一个网络。
If the net has a dont_touch attribute on it, Design Compiler is not allowed to insert logic between theinput and output port connections, and the assign statement will remain in your netlist.
如果此网络具有dont_touch属性,DC编译器将不被允许在输入输出端口连接中间插入逻辑,assign语句还会存在于网表中。
You can correct this situation in the following ways:
你可以使用下面方法修复:
1. Remove the dont_touch attribute. 去除dont_touch属性
2. Manually insert a buffer on the net between the input and output ports to prevent the assignstatement.
在输入端口和输出端口间手动插入一个buffer来避免assign语句。
Three-State Elements三态元素
To avoid getting assign statements with three-state elements, set the verilogout_no_tri variable totrue before writing out the netlist. Also, check that verilogout_equation is set to false.
要避免有三态元素引起的assign语句,在写出网表文件之前,设定verilogout_no_tri变量为true,且检查变量verilogout_equation设定为false。
verilogout_no_tri = true
verilogout_equation = false
You can read in your compiled .db file, set the verilogout variables, and then write out the netlist.(The verilogout_equation and verilogout_no_tri variables determine the Verilog output with thewrite -f verilog -hier -o command.) The verilogout_equation and verilogout_no_tri variables do notaffect the compile process.
你可以读入你的编译后的.db文件,设定verilogout变量,然后写出网表文件。(变量verilogout_no_tri和verilogout_equation与命令write -f verilog -hier -o一起决定了verilog的输出。)变量verilogout_no_tri和verilogout_equation不影响编译过程。
To see whether the settings help eliminate the assign statements, set the variables and thenwrite the netlist. Here is a small example of the steps required to do this in dcsh mode:
要看这些设定是否帮助消除了assign语句,可以设定这些变量然后写出网表。这里提供一个dcsh格式的例子。
verilogout_equation = false
verilogout_no_tri = true
read -f db your_compiled_file.db
list verilogout_equation
list verilogout_no_tri
write -f verilog -hierarchy -o netlist.v
write -f db -hierarchy -o netlist.db
2010年12月6日补充:
当使用上述方法去除assign后,写出的网表文件中还是包含assign语句。使用report_comile_options命令来报告每一个design的编译选项,发现只有top的具有fix_multiple_port_nets选项。而我编译时没有使用ungroup_all选项,分析应该是编译时只是对顶层design去除了assign语句,而其它层次的design中依然保留有assign语句。
解决办法:编译时使用-ungroup_all选项
compile -ungroup_all
2010年12月17日补充:
12月6日的补充有问题。用report_compile_options命令只会显示top设计有没有fix_multiple_port_nets选项。如果有此选项,表示其整个设计的hierarchy都会在编译时fix_multiple_port_nets。所以,assign出现的原因并不是有些sub-level design没有fix_multiple_port_nets属性造成的。我也查找排除了dont_touch属性而导致编译器不能去除assign语句。
发现使用change_names -hier -rules verilog可以去除assign语句。分析应该是verilog命名规则中两个选项起的作用:
equal_ports_nets: true
inout_ports_equal_nets: true