【问题标题】:different clock contraints on the same clock同一时钟上的不同时钟约束
【发布时间】:2018-05-03 23:35:23
【问题描述】:

如何对同一时钟域中的信号设置不同的时钟约束?

在我的设计中,我有一个可通过 APB 寄存器配置的 PLL。 我也在使用 2 种模式(模式 1 和模式 2)。 根据模式(用户可选择),时钟输出为 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 中的约束,以便在模块 1 中获得更好的结果。

在模块 2 上使用多周期路径可能是时钟 @100 MHz 和 50 MHz 而不是时钟 @ 100 MHz 和 70 MHz 的解决方案。

注意:I_mode1(配置模式)被认为是静态的。 注2:I_*代表输入,O_*输出,S_*信号。

问候,

【问题讨论】:

  • 约束不固定时钟频率。它告诉工具您的逻辑需要最大 路径延迟才能工作。由于这个最大值随着三个时钟速度的上升而减小,因此您只需使用最快时钟的约束。
  • @JHBonarius:问题在于,如果顶层时钟被限制在要求更高的 100 MHz 时序,那么模块 2 就会受到过度限制。您是否尝试将 70 MHz 约束应用于模块 2 内的 I_clk 信号?计时工具应警告重叠约束并告诉您有效应用了哪个约束。也许您的工具还允许具有非整数多重性的多循环路径约束,例如 1.4 ...
  • 然后只需将每个模块连接到自己的时钟即可。使用时钟域交叉技术将它们连接到数据总线。无论如何,您为什么要将它们与一个时钟组合在一个块中?你让你的生活变得复杂
  • @damage :该工具不允许非整数多周期约束和 70MHz 约束在 100MHz 时钟域中给我带来更差的结果。@JHBonarius :我别无选择:两个时钟是完全相同的网络(来自 APB 可配置的 PLL 的相同输出)。在一种模式下,此时钟输出为 70MHz,在另一种模式下,此相同输出为 100MHz。如果我制作 2 个不同的块,它们都将具有相同的时钟输入,所以它是相同的。
  • @damage :我会尝试把时钟约束放到block模块里面,让你知道结果。

标签: constraints vhdl clock synthesis


【解决方案1】:

然而 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_data1S_data2 是多路复用的,因此那里存在时钟域交叉。我会在逻辑上定义时钟,以避免不同时钟域之间的时序冲突。

set_clock_groups -logically_exclusive -group CLK1 -group CLK2

【讨论】:

    猜你喜欢
    • 2012-06-08
    • 2012-05-27
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多