分频电路在做综合时的问题(没产生分频时钟)
综合时的约束我是一开始我是这样写的:
create_clock [get_ports g_clk] -name g_clk -period 10 -waveform {0 5}
create_generated_clock -name g_clk -source [get_ports g_clk] -divide_by 10 [get_ports l_clk]
然后综合时报错,说 Can't find clock 'l_clk' in design 'clock_gen'.
之后网上看到说红体标出的部分要写成综合后的pin脚,于是改成:
create_generated_clock -name g_clk -source [get_pins U16/Z] -divide_by 10 [get_ports l_clk]
还是报错说:Can't find object 'U16/Z' in design 'clock_gen'.
所以求教大神们,该怎么写约束能正确地综合。
附上verilog代码:
`timescale 1ns/10ps
module clock_gen(rst, l_clk, g_clk);
input rst, g_clk;
output l_clk;
reg l_clk;
reg[7:0] j;
//counter
always @(posedge g_clk or negedge rst)
if(!rst)
j <= 0;
else if(j == 9)
j <= 0;
else
j <= j + 1;
//clock generation
always @(posedge g_clk or negedge rst)
if(!rst)
l_clk <= 0;
else if(j == 9)
l_clk <= ~l_clk;
endmodule
2个红色的反一下试试.
create_generated_clock -name g_clk -source [get_ports g_clk] -divide_by 10 [get_pins l_clk]
刚刚试了,还是一样的Can't find object 'l_clk' in design 'clock_gen_000000'.
感觉你代码写的很奇怪
第一个always里j的输出是0~8,到不了9(综合为与1的循环加法器)
然后j的输出与9做比较,相等输出1,不相等输出0(综合为与4`b9的比较器)
何不直接一个always
if(j==9)
begin
j<=0;
l_clk<=0;
end
你这时钟约束有问题啊 首先你在顶层port上定义了一个时钟,然后你后面的又在该port 定义了一个派生时钟,这样相冲突的。后面修改的红色约束也有问题的。source 的时钟该是你的主时钟。
create_generated_clock [get_pins U16/Z] -name g_clk -source { l_clk} -divide_by 10 这样修改才是对的,看你对时钟约束理解很矛盾啊
啊,抱歉,发现贴上来时弄错了,我原文件中是这样的:
create_clock [get_ports g_clk] -name g_clk -period 10 -waveform {0 5}
create_generated_clock [get_ports l_clk] -name l_clk -source [get_ports g_clk] -divide_by 10
然后报错就是上文提到的错误。
我一开始是写在一个always块中的,但是老师说最好写到两个块中,于是我就分开写了。
改回到一个always块中以后,果然不再报错了,但是只综合出了加法器,还是没有时钟信号的产生,这个是什么原因呢?
但是timing report的路径里面又有了l_clk:
Startpoint: U16/Z (internal pin)
Endpoint: l_clk (output port)
可是在综合出来的电路图中没有找到U16。
按你原文的约束 ,可以理解成输入一个时钟,输出一个为输入时钟的10分频的时钟, 你在综合的约束里面可以这样写, create_generated_clock [get_pins A/B/Q] -name l_clk -source { g_clk} -divide_by 10, 意思是在A模块下面B register的Q端创建一个派生时钟。 你就不用去管哪个instance 单元了。
我按您说的改了create_generated_clock [get_pins A/B/Q] -name l_clk -source { g_clk} -divide_by 10,
但还是报错Can't find object 'A/B/Q' in design 'clock_gen'.
请问您说的A、B、Q是可以随便这么写还是说让我用自己设计中的模块名称代替?但是我好像没有模块名,综合出来也没有寄存器。
我的意思是一个例子,具体的名字还是要和模块名一致,如果你只有一个模块的话就直接写
create_generated_clock [get_pins 模块名/时钟寄存器/Q] -name l_clk -source { g_clk} -divide_by 10,
如果只有顶层模块。 模块名就不用写了。 你会申明一个寄存器,当然我不知道你会怎么申明哈。我给你一个列子 你看看也许明白了
module div(
clk,
rst_n,
clk_div
);
input clk, rst_n;
output clk_div;
reg clk_div;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
clk_div <= 1'b0;
else
clk_div <= ~ clk_div;
end
endmodule
时钟约束:
create_clock [get_ports clk] -name clk -period 10 -waveform {0 5}
create_generated_clock [get_pins clk_div_reg/Q] -name clk_div -source { clk} -divide_by 10
不知道 这样你能看明白不
最好能把第二个always中的if。else if。else补全,代码风格会导致很多问题
懂了。啊啊啊,我觉得我好笨呐。含泪拜谢
对了,大神能介绍一些综合方面的好的书籍么。我也是刚刚开始做综合,好多基本的都不懂。
恩恩,加上了~
可以看得出你使用触发器生成一个10分频的时钟
你可以这样定义该生成时钟:
create_generated_clock -name l_clk -source g_clk -divide_by 10 [get_pins I_clk_reg/Q]
LZ能否把最后正确的脚本和verilog代码贴出来,让大家学习下。
看了上面一些大侠的评论,大概了解了到,就是在create_generated_clock的时候,要get寄存器的Q端,
但为什么不能get最后的output呢?难道中间又插入了啥啥逻辑。
请大牛指点。
如果再加一个clk_div_2,即always @(posedge clk_div or negedge rst_n)
begin
if(!rst_n)
clk_div_2 <= 1'b0;
else
clk_div_2 <= ~ clk_div_2;
end
那么create_generated_clock [get_pins clk_div_2_reg/Q] -name clk_div_2 -source { clk_div} -divide_by 2 这样写对吗?
create_generated_clock [get_pins clk_div_2_reg/Q] -name clk_div_2 -source { clk} -divide_by 4 那这个对不对?
:)