请教一个关于时序约束的问题,请高人赐教,谢谢!欢迎讨论
1. create_clock -name clk1 -period 10 [get_ports clk1];
2. create_generated_clock -name clk2 -divide_by 2 -source clk1 [get_ports clk2];
可能写的有些错误,这里我主要有两个问题:
1. 关于get_pins 与 get_ports与get_pins的用法,假如我编写的程序里面有top(最顶层模块),还有base1,base2,base3.....模块,关于base1的模块的输入输出是用get_ports还是get_pins写约束呢?有高人能讲一下get_ports与get_pins的区别吗?请勿见笑,初学者,谢谢。
2. 关于上面的第二个语句能直接产生clk2时钟吗,是不是还得编写一个2分频的模块,在这个模块基础上进行输入输出约束么?用Tcl脚本能直接产生时钟么?或者说有没有不用编写Verilog程序直接用约束生成逻辑?谢谢
1.
get ports用来约束芯片的管脚, 注意在这里虽然管脚英文名是pins,但这里用的不是get pins.
get pins用来约束模块之间的输入输出信号.
2.约束不能直接产生逻辑或者时钟,你要约束一个二分频,你必须要事先有一个2分频时钟.
谢谢!另外,我想请教一下:
module sdc_test
(
input clk,
output clkout
);
reg flag;
always @ (posedge clk)
flag <= !flag;
assign clkout = flag;
endmodule
.sdc文件内容:
create_clock -name clk -period 37.037 [get_ports clk] #####27M时钟
create_generated_clock -name clkout -edges {1 3 5} -source clk -edge_shift {5 5 0} [get_ports clkout]
这样综合以后的程序会按照我的想法,产生的2分频时钟有偏离量吗?
不会的,如果你想要分频时钟有相位偏移,应该用pll产生带相位偏移的分频时钟,再用sdc约束;
约束永远只是约束你的设计,不会替你设计;
楼上您好,你说的我也不太明白。不过我仿真以后的确没有产生偏移量。但是create_generated_clock提供了-edges与-edge_shift的参数,如果不能产生偏移量为什么要提供这些参数呢?能给讲一下约束的作用吗,适用在哪些场合比较好。我听了你说的,只是有些不太明白
比如你说的约束设计,使用了-edge_shift {x y z}不也是约束了设计吗
好的,谢谢,有点明白了。呵呵
约束是为了让quartus II 软件中的时序分析明白你设计的意图,并且根据使得你的设计满足时序要求.
比如说我要约束一个时钟的频率为100Mhz, 前提是你首先要在设计中产生一个100Mhz的时钟(比如片上时钟接口,或者pll输出);
当你有了这个时钟之后,你把他约束为100Mhz, 这样软件就会根据这个约束使得你的电路中这个时钟域满足所需要的建立时间条件,让它能跑到
100Mhz.
又比如说我设计另外一个时钟,频率是之前那个时钟的二倍,并且有一定的相位偏移.那我也要通过约束命令告诉软件这两个时钟的关系,Quartus II会利用这个关系使得电路满足相应的建立时间\保持时间要求.
谢谢,你的意思是不是我可以理解成必须设计了这样的时钟(比如是这两个时钟,bclk是aclk的1/2,且相对于aclk有一定的时钟偏移),然后写这样的约束告诉FPGA。如果我只是单纯的定义了两个时钟,而是想通过约束使bclk相对于aclk有相位偏移的话,FPGA是没有办法帮我设计的。这是不是可以理解成一个有阈值的设计,已经超过了阈值然后FPGA就不能设计了?可以这样理解吗?
还有一个问题还需要请教,比如我打算对FPGA设计增加一些约束,以get_pins为例,可能需要用到一个register,比如pll来说吧,在FPGA内部可能是这样写:pll27m|altpll_**|clk[0],我需要这么找到这些“隐性”的中间register或者~net呢,是从RTL视图里面找吗,有没有什么值得推荐的找寻办法。再次感谢。
觉得你说的很有道理啊。谢谢啊。学习了。呵呵~
你关于阈值的理解基本正确,不过需要注意的是这个"阈值"的大小是时序分析软件根据可用资源估算出来了,并不是一成不变的值;
比如我的一个设计想要约束到200Mhz,如果FPGA内有足够的布局布线资源,相关时钟域的逻辑资源距离较近,那么是由可能的.但是如果
我想跑到1000Mhz,则对于FPGA来说一般都是无法完成的任务;相应的,如果我布局布线资源很少,那么即便可能跑200Mhz都跑不到.
寄存器的名字用Quartus里面Name Finder工具搜索即可; 善用?和*等符号可以使搜索更方便. Name Finder在Quartus II->Edit->Insert Constraint->任选一项->Target里面可以调用. 应该也可以用tcl查找,不过不太清楚怎么做.
遇见高手了,论坛里面的确藏龙卧虎,万分感谢!希望以后您能多多赐教!
学习一下!
