优化与防止被优化.docx
《优化与防止被优化.docx》由会员分享,可在线阅读,更多相关《优化与防止被优化.docx(28页珍藏版)》请在冰点文库上搜索。
![优化与防止被优化.docx](https://file1.bingdoc.com/fileroot1/2023-7/7/d49d37aa-142f-4a2a-a5d9-134a6aac273a/d49d37aa-142f-4a2a-a5d9-134a6aac273a1.gif)
优化与防止被优化
注册登录
*论坛
•搜索
•帮助
•导航
CEEZCSSoCVista--IC/FPGA设计家园?
30分钟必答-无限制提问专区?
设计未完成阶段进行面积评估如何防止被优化
|l2下一页
返回列表回复发帖
1#
打印
字体大小:
tT
mentorOO
超级通吃版主
□发表于2009-11-809:
48|只看该作者
设计未完成阶段进行面积评估如何防止被优化
(本文来自anthonyyi的来信。
请大家一起来解答。
)
为了对整个设计进行性能和面积的评估
在模块尚未全部完成的阶段进入FPGA综合阶段
在顶层设计中instance了所有已完成的模块
但这些模块中有的由于后续模块没有完成,其输出悬空,即没有load
在Synplify下使用Syn_noprune属性
发现在compile阶段能保留上述模块,其RTLview显示模块存在
在map之后观测Technologyview发现上述模块已经被优化掉
只剩下输入端口,且无drive
故综合报告无实际意义和参考价值
想请教在如何不改变顶层模块的输出管脚而使综合保留上述无输出的模块
个人想到一种,用syn_probe将输出netprobe出来,但这样会有风险
因为综合工具似乎只会保留这些与该输出有关的逻辑而优化掉其他的部分
而且该步骤没有进行实战确认:
(
本主题由admin于2009-12-207:
56力卩入精华
收藏分享评分
回复引用
订阅TOP
2#
£3发表于2009-11-810:
04|只看该作者
我想可以参考一下下面的转载内容
提问:
我使用的是synplifypro综合verilog语言,例化了一个BUF,在综合结果里也看到了这个BUF,
mentorOO
超级通
吃版主
但是在MAP是这个BUF还是被优化掉了,请问用什么方法将这个BUF保留下来?
解答:
在这个BUF两端的信号线上加上下面的属性一一
wirebufin/*synthesissyn_keep=1xc_props="X"*/;
wirebufout/*synthesissyn_keep=1xc_props="X"*/;
解释下:
1、syn_keep=1就是保留这个信号线,是它成为一个instance(synplify的),然后就可以对
它添加XILINX的约束属性;
2、xc_props=""是synplify为XILINX保留留的约束属性,可以透传到ISE的实现中去,从
而约束实现过程。
3、“X”属性是在MAP时识别的KEEP属性,如果用XST综合就只需要在信号线的两端加上X属性就可以透传到MAP中去。
但是synplify并不能识别,因此需要通过以上的方法将X属性透传
至UMAP中去。
回复引用
TOP
3#
□发表于2009-11-810:
04|只看该作者
如果是VHDL可以这样来解决
LIBRARYieee;
USEieee.std_logic_1164.all;
USEieee.std_logic_arith.all;
librarysynplify;
USEsynplify.attributes.all;
ENTITYdelay_cellIS
PORT(
mentorOO
超级通
吃版主
dly_in:
INSTD_LOGIC;
dly_out:
OUTSTD_LOGIC
);
ENDdelay_cell;
ARCHITECTUREarchiOFdelay_cellIS
--attributesyn_keep:
boolean;
SIGNALtemp01,temp02,temp03,temp04,temp05,temp06,temp07,temp08,temp09,temp10,temp11,temp12,temp13:
STD_LOGIC;
attributesyn_keepoftemp01,temp02,temp03,temp04,temp05,temp06,temp07,temp08,temp09,temp10,temp11,temp12,temp13:
signalistrue;
attributexc_propsoftemp01,temp02,temp03,temp04,temp05,temp06,temp07,temp08,temp09,temp10,temp11,temp12,temp13:
signalis"X";
BEGIN
temp01<=NOTdly_in;
temp02<=NOTtemp01;
temp03<=NOTtemp02;
temp04<=NOTtemp03;
temp05<=NOTtemp04;
temp06<=NOTtemp05;
temp07<=NOTtemp06;
temp08<=NOTtemp07;
temp09<=NOTtemp08;
tempIO<=NOTtemp09;templl<=NOTtempIO;
temp12<=NOTtempll;temp13<=NOTtemp12;dly_out<=NOTtemp13;
ENDarchi;
回复引用
TOP
vimicro
通吃版
主
4#
□发表于2009-11-820:
38|只看该作者
对一些buffer设置setdonttouch
回复引用
TOP
5#
□发表于2009-11-821:
42|只看该作者
以下是我根据mentor00老师的帖子进行实验的一个小例子
anthonyyi
通吃版
主
moduletest(clk,rst_n);
inputclk;
inputrst_n;
counteru_counter/*synthesissyn_noprune=1*/(
.clk(clk),
.rst_n(rst_n),
.p0(p0),
.p1(p1)
);
endmodule
modulecounter(
clk,
rst_n,
p0,
p1
);
inputclk;
inputrst_n;
outputp0;
outputp1;
wirep0/*synthesissyn_keep=1xc_props="X"*/;
wirep1;
reg[3:
0]counter;
assignp0=counter[2];
assignp1=counter[3];
always@(posedgeclkornegedgerst_n)
if(!
rst_n)
counter<=4'h0;
else
counter<=counter+1'b1;
endmodule
从综合的结果来看,发现添加syn_keep和xc_props的P0端口在mapping之后保留
其technologyview可以看到综合结果包括三个寄存器counter[0:
2]
未添加约束的counter[3]被优化掉了
按照这种方法需要将所有需要保存模块输出加上syn_keep属性
此外根据synplify最新版本的提示
@W:
FX350|xc_propsattributeisobsoleteandwillnotbesupportedinafuture
release.Pleaseusetheattributesinsidethexc_propsstringdirectlyor
generics/parametersiftheyareavailable
这个属性要改成个什么样子呢
回复引用
TOP
anthonyyi
通吃版
主
6#
□发表于2009-11-821:
43|只看该作者
原帖由vimicro于2009-11-820:
38发表©
对一些buffer设置setdonttouch
HowcanIdoit,whereisthekeypositionformetofindthebuffer
回复引用
TOP
□发表于2009-11-822:
03|只看该作者
此外由于希望在整个评估过程中尽量不改动模块级的RTL代码
anthonyyi
通吃版主
顶层的syn_noprone属性一定需要添加
否则compile都过不了,直接就被优化掉了
而且syn_keep的属性必须放在wire定义的那行,放在assign的位置也会被优化掉
并且由于syn_keep属性只能针对wire类型
必须从rtlview中找到对应的线添加到sdc文件中才行:
)
请大家一起试试,看看有没有别的方法
回复引用
mentor00
超级通吃版
主
TOP
8#
乙发表于2009-11-907:
45|只看该作者
谢谢anthony的及时反馈与共享。
回复引用
TOP
9#
ineedpower
管理员
□发表于2009-11-909:
46|只看该作者
原帖由anthonyyi于2009-11-822:
03
发表
而且syn_keep的属性必须放在wire定义的那行,放在
assign的位置也会被优化掉
一直以来都以为对于wire和reg类型都可以使用的
回复引用
TOP
anthonyyi
通吃版主
#
10
□发表于2009-11-910:
20|只看该作者
寄存器用syn_preserve
syn_preserveensuresthatregistersarenotoptimizedaway
回复发帖
#
11
ineedpower□发表于2009-11-910:
37|只看该作者
官理员4-Verilog开发仿真»SynplifySCOPE属性高手的秘密
©©曲
可惜好像还是tobecontinued
回复引用
TOP
12#
vimicro
通吃版
主
0右金
□发表于2009-11-1109:
57|只看该作者
回复6#的帖子
不太明白你的意思我的意思是直接在例化的modulename上面设
对了我是说DC是ASIC流程,FPGA上面我不知道能否这样做
shared]Verilog综合时wire与reg如何防止被优化
(1)
2009-11-2914:
14
Abstract
撰寫Verilog時,雖然每個module都會先用ModelSim或QuartusII自帶的simulator仿真過,但真的將每個module合併時,一些不可預期的『run-time』
問題可能才一一浮現,這時得靠SignalTapII來幫忙debug。
Introduction
使用環境:
QuartusII8.0+DE2-70(CycloneIIEP2C70F896C6N)
實際使用SignalTapII時,會發現有些reg與wire可以觀察,有些又無法觀察,
在(原創)如何使用SignalTapII觀察reg值?
(ICDesign)(QuartusII)
(SignalTapII)(Verilog)中,我利用將reg接到topmodule的方式來觀察reg,雖然可行,但老實說並不是很好的方式。
當初有網友發表評論,說這是因為reg
被QuartusII優化掉不見了,導致無法使用SignalTapII觀察,本文整理出完整的reg與wire觀察方法。
觀察reg
如同(原創)如何使用SignalTapII觀察reg值?
(ICDesign)(QuartusII)(SignalTapII)(Verilog)的範例,我再重複一次。
SSignalTapll_register_not_preserve.v/Verilog
1/*
2(C)OOMusou2008
3
3Filename:
SignalTapll_register_not_preserve.v
4Compiler:
QuartusII8.0
5Description:
DemohowtopreserveregisterwithSingalTapII
6Release:
10/17/20081.0
7*/
9
8moduleSignalTapll_register_not_preserve(
9inputiCLK,
10inputiRST_N
11);
14
12reg[3:
0]cnt;
16
13always@(posedgeiCLK,negedgeiRST_N)begin
14if(!
iRST_N)
15cnt<=4'h0;
16else
17cnt<=cnt+4'h1;
18end
23
19endmodule
這是個很簡單的計數器,我故意讓cnt不做output,而想用SignalTapII去觀
察ent這個reg的值
ent都是0,顯然不合理,表示SignalTapII無法captureent這個reg的值為什麼會這樣呢?
若我們將SignalTapII拿掉,重新用QuartusII編譯,觀察其compilation
report,顯示register為0。
flawStatus
Successful-FriOct172213:
132008
Quartu^HVersion
GOBuild21505/29/2008SJFullVersion
RevisionName
SigrialTapH_regiater_nGt_preseive
Top-levelEntityName
SignalTdpH_regitter_notjareserve
Family
CycloneU
Device
EP2C70FS96C6
TimingModels
Final
Mettimingrequirements
Yes
Totallogicelements-
0/68.416(0%)
TotalcoonbinationaHunclions
口edicatedlogicreaisteri
0/68,416(0%]
Io^aTregister^
Totalpins
■^7622(<1%)
Totalvirtualpins
0
TotalmemQtybits
0/1,15^000(0%)
EmbeddedMultiplier9-bitelements
0/300(0%)
TotalPLL$
0/4(096)
觀察RTLViewer的合成結果,真的沒有register!
!
iRST_NfGhJD)l>
iCLK(GND)r>
這證明了一件事情,QuartusII在合成時,發現ent並沒有需要output,而自動最佳化不合成ent,導致SignalTapII無法觀察reg,不過有時為了debug
方便,我們就是想觀察這種reg,有辦法讓QuartusII暫時不要啟動最佳化嗎?
使用SynthesisAttribute避免最佳化
SignalTapll_register_preserve.v/Verilog
1/*
2(C)OOMusou2008
3
3Filename:
SignalTapll_register_preserve.v
4Compiler:
QuartusII8.0
5Description:
DemohowtopreserveregisterinSignalTapII
6Release:
10/17/20081.0
7*/
10moduleSignalTapII_register_preserve(
11inputiCLK,
12inputiRST_N
13)
14
15reg[3:
0]cnt/*synthesisnoprune*/;
16
17always@(posedgeiCLK,negedgeiRST_N)begin
18if(!
iRST_N)
19cnt<=4'h0;
20else
21cnt<=cnt+4'h1;
22end
23
24endmodule
15行
reg[3:
0]cnt/*synthesisnoprune*/;
多了/*synthesisnoprune*/這個synthesisattribute,指示QuartusII不要
對cnt做最佳化,保留此register以供SignalTapII觀察,注意必須寫在分
號前面,不能如下寫在分號後面。
reg[3:
0]cnt;/*synthesisnoprune*///錯!
!
編譯後,SignalTapII就能順利的觀察到cnt的值!
!
重點是不需改topmodule的interface,只需對想觀察的reg加上synthesisattribute即可。
SQuartusH-D:
/r0Clare/DE2-70/Q80/Signa[Tapn_regi5ter_pre5en/e/Signal
FileEditViewProjectProcessinqToolsWindow
■Acquisitioninprogress
y>SOFManagei:
log.2005/10/1723:
02.05#0
Cl
国Data皋ISetup
HierarchyDisplay
XrrataLoc:
囤
171♦SignalTap11_registei_pies6rve
■—|SIauto_signaltap_0
團auto_signaltap_0ForHelp,pressFl
QuartusII也支援Verilog2001的語法
1/*
2(C)OOMusou2008
3
3Filename:
SignalTapll_register_preserve.v
4Compiler:
QuartusII8.0
5Description:
DemohowtopreserveregisterinSignalTapII
6Release:
10/17/20081.0
7*/
9
8moduleSignalTapII_register_preserve(
9inputiCLK,
10inputiRST_N
11);
14
12//Verilog2001
13//(*noprune*)reg[3:
0]cnt;
17
14always@(posedgeiCLK,negedgeiRST_N)begin
15if(!
iRST_N)
16ent<=4'hO;
17else
18ent<=ent+4'h1;
19end
24
20endmodule
16行
(*noprune*)reg[3:
0]ent;
這是Verilog2001的語法,QuartusII8.0也能看得懂。
放在
若希望整個module的reg都不被最佳化,可將synthesisattributemodule。
1/*
2(C)OOMusou2008http:
//oomusou.enblogs.eom
3
3Filename:
SignalTapll_register_preserve.v
4Compiler:
QuartusII8.0
5Deseription:
DemohowtopreserveregisterinSignalTapII
6Release:
10/17/20081.0
7*/
9
8moduleSignalTapII_register_preserve(
9inputiCLK,
10inputiRST_N
11)/*synthesisnoprune*/;
14
12reg[3:
0]ent;
16
13always@(posedgeiCLK,negedgeiRST_N)begin
14if(!
iRST_N)
15ent<=4'h0;
16else
17ent<=ent+4'h1;
18end
23
19endmodule
13行
moduleSignalTapll_register_preserve(
inputiCLK,
inputiRST_N
〃);
)/*synthesisnoprune*/;
將/*synthesisnoprune*/放在module,這樣整個module的reg將不被最佳化,
不用再一一指定。
另外一個與reg相關的SynthesisAttribute:
/*synthesispreserve*/
跟reg相關的attribute/*synthesispreserve*/
,除了/*synthesisnoprune*/可用,還有一個
可用,兩者的差異在於:
/*synthesisnoprune*/
避免QuartusII優化掉沒output的reg。
/*synthesispreserve*/reg。
避免QuartusII將reg優化為常數,或者合併重複的
也可以使用Verilog2001
的寫法
//(*preserve*)reg[3:
0]cnt;
或者整個module的寫法
moduleSignalTapll_register_preserve(inputiCLK,inputiRST_N
)/*synthesispreserve*/;
类别:
Ic|转贴卜"|添加到搜藏|分享到i贴吧|浏览(329)|评论(0)ffi
上一篇:
[shared]Ubuntu下安装Cadenee51...下一篇:
[shared]Verilog综合时wire与reg...mi最近读者:
kimi169coffindidijadekung盖塔Qpeipeiha