如何在同一时钟域中对信号进行不同的时钟约束?
在我的设计中,我有一个可通过APB寄存器配置的PLL。 我也在使用2种模式(mode1和mode2)。 根据模式(可由用户选择),时钟输出为100 MHz或70 MHz。
由于时钟来自相同的PLL输出,因此相同的时钟用于设计工作在模式1的@ 100 MHz和模式2的@ 70 MHz。
以下是顶级实体的结构:
entity myTopLevel is
port(
I_clk : in std_logic; -- the PLL output; @100MHz or 70 MHz
I_rst : in std_logic; -- input rst
I_mode1 : in std_logic; -- when '1' : I_clk is running @ 100 MHz, when '0' : 70 MHz
I_data : in std_logic_vector(15 downto 0);
O_data : out std_logic_vector(15 downto 0));
在顶级实体内部,有2个模块。 1运行@ 100 MHz,当I_mode1 =' 0'时,它处于复位状态。另一个是运行@ 70 MHz,当I_mode1 =' 1' :
INST1 : myProcessModuleMode1
port (
I_clk1 => I_clk,
I_rst1 => S_rst1, -- asserted when I_mode1 = '0'
I_data1=> I_data,
O_data1=> S_data1)
INST2 : myProcessModuleMode2
port (
I_clk2 => I_clk,
I_rst2 => S_rst2, -- asserted when I_mode2 = '0'
I_data2=> I_data,
O_data2=> S_data2)
O_data <= S_data1 when I_mode1='1' else S_data2;
但是,myProcessModuleMode2比myProcessModuleMode1慢。所以我想在module2上添加约束@ 70 MHz,在module1上添加100 MHz。可能吗 ? 对于当前版本,我正在限制时钟@ 100 MHz并且我得到(在合成/放置和路由之后)90 MHz,模块2中有负余量(这是好的,我想要70 MHz)和模块1中的一些负面松弛。 .. 我想在模块2中释放约束以在module1中获得更好的结果。
在module2上使用多周期路径可能是时钟@ 100 MHz和50 MHz的解决方案,而不是时钟@ 100 MHz&amp; 70 MHz。
注意:I_mode1(配置模式)被认为是静态的。 注2:I_ *代表输入,O_ *输出和S_ *信号。
此致
答案 0 :(得分:0)
然而,OP没有提到工具和平台,我将展示SDC格式的限制,这种限制得到了广泛支持(由Synopsys,Cadence,Xilinx,Intel / Altera等)。
每个模块通过其时钟输入可以有自己的时钟约束。
create_clock -name CLK1 -period 10 -waveform "0 5" [get_pins myProcessModuleMode1/I_clk1]
create_clock -name CLK2 -period 14 -waveform "0 7" [get_pins myProcessModuleMode2/I_clk2]
现在Module1和Module2分别限制在100MHz和~70MHz。
由于S_data1
和S_data2
是多路复用的,因此存在时钟域交叉。我将逻辑上定义时钟,以避免不同时钟域之间的时序冲突。
set_clock_groups -logically_exclusive -group CLK1 -group CLK2