Forum Discussion

Altera_Forum's avatar
Altera_Forum
Icon for Honored Contributor rankHonored Contributor
14 years ago

How to handle this hold time violated?

I have a design, part of the design is :

PLL_6us_3us_300ns pll1(.areset(~ireset),.inclk0(clk),.c0(clk_6us),.c1(clk_3us),.c2(clk_300ns),.locked(lock));

always @(negedge clk)

begin

if ((counterScan>14 && counterScan<31) || (counterSystemReset>300 && counterSystemReset<321) )

CK_Scan<=clk_300ns;

else

CK_Scan<=1'b0;

end

I have a PLL module, the "clk" period is 40ns, and pll will generate clock signals whose period are 6us, 3us, and 300ns respectively.

Then I will create a gated clock signal "CK_Scan", when the "counterScan" or "counterSystemReset" in a specific range, the CK_Scan will be 300ns clock signal.

In order to avoid a glitch, I made the "CK_Scan" as a register output, and use the quick clock "clk" to drive this it, but I use the negedge to trigger it.

After I did the STA in TimeQuest, there is a hold violated as attachment. I can't understand this since it assign "clk_300ns" and "clk" as launch and latch clock respectively. instead I think both launch and latch clock should be "clk".

In my .sdc file, the commands I have as following:

create_clock -name sys_clk -period 40.0 [get_ports clk]

derive_pll_clocks

derive_clock_uncertainty

Is that my judgment right? If it is, why TimeQuest mistake it? If I am wrong, anbody can help me understand this and how can I handle this violated?

Thanks very much!

16 Replies