我们说我有一个代码:
wire clk1;
wire clk2;
assign clk1 = Clk;
assign Clk2 = Clk;
现在clk1和clk2用于为各种模块提供时钟并遍历设计的层次结构。在层次结构深处的某个地方,如果模块由clk1计时,它的输出是否与module2中的另一个保持同步?
e.g。
reg r1;
always @ (posedge clk1)
r1 <= rSomething;
reg r2;
always @ (posedge clk2)
r2 <= r1;
这段代码有效吗?综合工具(Altera工具链)是否会保持这两个时钟的偏差?或者它只会在命名相同的时钟上保持偏斜,而clk1和clk2将不再是同步的,尽管它们有共同的来源?
由于
EDIT1:这用于合成,而不是模拟。
EDIT2:更改了第二个代码示例。我试图分配r2&lt; = r1,而不是像前面那样反过来。
答案 0 :(得分:2)
重命名的时钟保持同步。显式连续赋值,类似于通过连接信号名称和端口名称不同的端口传递信号。
但是,我所知道的任何综合工具都不允许您从多个进程分配同一个变量。
答案 1 :(得分:2)
合成器会将您的设计输入转换为代表逻辑结构的内部网表。这通常分两个阶段完成。首先是表示抽象操作的高级行为形式,然后是直接实现目标体系结构的逻辑基元的技术映射形式。在此转换过程中,clk1
和clkl2
将被视为在拓扑上等同于clk
,并且它们将被视为一个组合网络。
正常的时钟缓冲区插入过程将考虑统一网络中所有叶节点的偏差。任何时间限制都需要放在clk
上。单独约束clk1
和clk2
的尝试可能会产生不可预测的结果。