首页>资讯>正文
FPGA时序分析-建立时间和保持时间裕量都是inf怎么解决呢?
2023-07-30 10:13:56    来源:FPGA开源工坊

今天有个小伙伴遇到一个问题,就是在vivado里面综合后看到的建立时间和保持时间裕量都是inf,我们来看看怎么解决这个问题。


【资料图】

实验一:

module testMem(    input clk,    input [9:0] addr,    input we,    input [7:0] wdata,    output reg [7:0] rdata     );    reg [7:0] mem [1023:0];    reg [7:0] data;    reg [7:0] data1;    reg [7:0] data2;    reg [7:0] data3;    always@(posedge clk)begin        if(we)begin            mem[addr] <= wdata;        end    end    always@(posedgeclk)beginrdata<=mem[addr];end    endmodule

时序约束如下:

create_clock -period 5.000 -name sys_clk [get_ports clk]set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports clk]

代码非常简单,大家一看就可以知道,这段代码会被映射到一个Bram上。综合后的资源报告也印证了我们的想法:

但是看时序分析:

是不是感觉很奇怪明明我们约束时钟了,为什么时序分析后是inf呢,我们来看一下他综合后的框图就明白了。

可以看到在上图里面,clk只和bram的时钟管脚相连,这种情况下怎么做时序分析嘛,一般我们在片内做的时序分析都是一个寄存器到另一个寄存器的。时序分析一共四种模型,可以参考下面四张图,分别是Input to Flip-flop Path,Flip-flop to Output Path,Flip-flop to Flip-flop Path,Input to Output Path图片来源于StaticTiming Analysis forNanometer Designs也就是静态时序分析圣经,这本必读哦。

实验二:

那怎么改变,vivado计算出来是inf呢,首先给输入输出加上

(*DONT_TOUCH="yes"*)

这个约束看看,代码就变成了下面这个样子

module testMem(inputclk,    (*DONT_TOUCH="yes"*)input [9:0] addr,    (*DONT_TOUCH="yes"*)input we,    (*DONT_TOUCH="yes"*)input [7:0] wdata,    (*DONT_TOUCH="yes"*)output reg [7:0] rdata    );    reg[7:0]mem[1023:0];    always@(posedge clk)begin        if(we)begin            mem[addr] <= wdata;        end    end        always@(posedge clk)begin            rdata <= mem[addr];end    endmodule

这次呢时序分析对了,我们来看一下综合后的结果,可以看到不再是孤零零的一个bram的ip了,这个就是典型的Flip-flop to Flip-flop Path的时序分析了。

但是注意到没有,实现的资源从bram变成lut和FF了,这个是因为在xilinx的器件里面,bram必须至少要有一级寄存器,那你可能又要问了,我们不是在代码里面rdata有一级寄存器吗,为啥没有被综合成bram呢,这个是因为加了dont touch的约束之后,vivado就不会再去优化这个寄存器,这样这个寄存器就不能被优化到bram里面了,这样自然就不会使用bram资源来实现上面的代码了。

实验三:

我们可以通过手动再加一级寄存器的方案,来让他使用bram资源,代码如下:

module testMem(inputclk,a    (*DONT_TOUCH="yes"*)input [9:0] addr,    (*DONT_TOUCH="yes"*)input we,    (*DONT_TOUCH="yes"*)input [7:0] wdata,    (*DONT_TOUCH="yes"*)output reg [7:0] rdata    );        reg [7:0] mem [1023:0];reg[7:0]data;    always@(posedge clk)begin        if(we)begin            mem[addr] <= wdata;        end    end        always@(posedge clk)begin            data <= mem[addr];    end    always@(posedge clk)begin            rdata <= data ;end    endmodule

可以看到时序分析,资源分析和我们预期是一致的。

综合后的结果也和我们预期一致,可以和实验一做对比,这次在bram后面多了一级寄存器哦。

实验四:

那么我们在上面的代码里面继续去掉dont touch约束看看会发生什么。

module testMem(    input clk,a    input [9:0] addr,    input we,input[7:0]wdata,    output reg [7:0] rdata    );        reg [7:0] mem [1023:0];    reg [7:0] data;    always@(posedge clk)begin        if(we)begin            mem[addr] <= wdata;        end    end            always@(posedge clk)begin            data <= mem[addr];    end    always@(posedge clk)begin            rdata <= data ;    end    endmodule

可以看到又变成了inf,再来看一下综合后的框图,和实验一一样,你可能会问,我们不是加了两级寄存器了吗,怎么bram的输出一个都没有呢,这是因为这两级寄存器都被bram给吸收了呢。小提示,这样两级寄存器的方式比一级的时序会好很多哦,当然如果如果寄存器不少纯打拍的话,他是不会被吸收进去的。

实验五:

既然打两拍不行,那就多打几拍咯。

代码变成下面的样子:

module testMem(    input clk,    input [9:0] addr,    input we,    input [7:0] wdata,outputreg[7:0]rdata    );        reg [7:0] mem [1023:0];    reg [7:0] data;    reg [7:0] data1;    reg [7:0] data2;    reg [7:0] data3;    always@(posedge clk)begin        if(we)begin            mem[addr] <= wdata;        end    end    always@(posedge clk)begin            data <= mem[addr];end    always@(posedge clk)begin            data1 <= data;            data2 <= data1;            data3 <= data2;            rdata <= data3;    end    endmodule

可以看到一切和我们的预期一致。

总之做FPGA一定要知道自己写的代码会被映射到什么资源上去哦。

审核编辑:刘清

关键词:

FPGA时序分析-建立时间和保持时间裕量都是inf怎么解决呢?

FPGA时序分析-建立时间和保持时间裕量都是inf怎么解决呢?-今天有个小2023-07-30

玩转趣味实验 播撒科学种子

玩转趣味实验播撒科学种子近日,宝塔路街道庄泉社区开展“神奇小实验科2023-07-30

手机文件夹个性名称怎么改(手机文件夹个性名称)

1、浅笑。2、优雅。3、漠视。4、唯美。本文到此讲解完毕了,希望2023-07-30

超80%医院停止服务!苏丹麻疹疫情暴发!病例已超900例……

当地时间7月28日,联合国人道主义事务协调厅就苏丹局势发布报告称,该2023-07-30

灵方皮舒克可以治疗阴虱吗_灵方外用药

重庆方龄三帆生物制药有限公司隶属于方龄,是一家专注于皮肤生态健康的2023-07-30

服务社区 同心童行

越是细微处,越能彰显温度从微笑开始,从细节出发打开大家伙的心门,拉2023-07-30

用地性质c21是什么意思啊(用地性质c21是什么意思)

今天小鱼来为大家解答以上问题,用地性质c21是什么意思啊,用地性质c212023-07-30

“小溪汇成大海”,《小溪流》45年精品典藏书系亮相全国书博会

7月28日,“小溪汇成大海,文学滋养童心——‘《小溪流》45年精品典藏2023-07-29

2023浙江中医药大学录取分数线是多少 2023浙江中医药大学录取规则

浙江中医药大学好的专业有中药学、口腔医学、药物制剂、药物制剂、临床2023-07-29

霞客行之江山多娇 | 珠江源头的霞客草堂——曲靖市“重走霞客路”系列报道之二

日前,记者参加云南省曲靖市“重走霞客路”活动,围绕“霞客行之江山多2023-07-29

三明沙县区2023年养老金调整方案公布 今年企退养老金上涨多少?

涨了!@沙县区人养老金终于涨了!2023年三明市沙县区养老金调整方案公2023-07-29

售罄怎么读拼音是什么(售罄怎么读)

来为大家解答以上的问题。售罄怎么读拼音是什么,售罄怎么读这个很多人2023-07-29

9700kf和11700(1170k和9700哪个好)

1170k和9700都好,i7-9700K的单核性能足够满足3A大作需要吗?我们知道,2023-07-29

华住酒店集团美股涨9.27%

华住酒店集团美股涨9 27%2023-07-29

营业执照和经营许可证的区别(营业执照和经营许可证)

我是小前,我来为大家解答以上问题。营业执照和经营许可证的区别,营业2023-07-29

福建多地迎破历史纪录强降雨 “卡努”31日起影响外海渔场

福建省自然资源厅联合福建省气象局发布的福建省地质灾害气象风险预警预2023-07-29

华为nova 10如何用QQ音乐换铃声

参考内容一:2、在时钟页面中,点击屏幕上方的加号,新增闹钟。3、根据2023-07-29

《最终幻想14》7.0“黄金的遗产” 大量情报公开!

《最终幻想14》在最新的活动上公开了7 0大版本“黄金的遗产”的先导预2023-07-29

肚子大怎么减掉大肚子(减掉大肚子的方法)

各位网友们好,我是编辑小夏,为大家解答肚子大怎么减掉大肚子,减掉大2023-07-29

7月28日基金净值:信澳领先智选混合最新净值0.6962,涨0.56%

7月28日,信澳领先智选混合最新单位净值为0 6962元,累计净值为0 69622023-07-29

高盛:美国经济增长稳健和美联储的政策粘性限制日元涨势

高盛:美国经济增长稳健和美联储的政策粘性限制日元涨势 【高盛:2023-07-29

黄花菜蛋汤怎么做?

主料:干黄花菜20克,鸡蛋3个,尖椒1个,胡萝卜10克。辅料:油适量,盐2023-07-29

e52670相当于i几(E52670相当于i系列的什么CPU)

E5-2670的PASS测试得分是12184分,相当于8代i58500处理器的水平(121012023-07-29

亚泰保级关键强援浮出水面大器晚成曾是国足当红国脚

现在效力长春亚泰的谭龙一直非常受球迷喜欢,因为谭龙在比赛中有十分精2023-07-29

cruisemain灯亮车怎么了奔腾 cruise main 灯亮 车怎么了怎么取消

2、cruisemain灯亮车怎么了怎么取消。3、车亮cruisemain灯是什么意思。2023-07-28