1、setup:$setup (data_event, reference_event, limit, notifier);
当reference_event time - limit < data_event time < reference_event time时,就会报告setup time violations。
$setup (data_event, reference_event, limit, notifier);
data_event:表示需要满足建立时间约束的数据事件(通常是寄存器或信号的变化)。
reference_event:是参考事件,通常是时钟的上升沿或下降沿,用于参照建立时间的时间基准。
limit:是建立时间的上限,表示在参考事件发生之前,数据事件必须已经稳定。
notifier:是一个可选参数,用于指定一个任务或过程,以便在发生违规时进行通知
module example (
input wire clk,
input wire data,
output reg result
);
always @(posedge clk) begin
// 假设 result 寄存器在时钟上升沿变化
result <= data;
end
// 设置建立时间约束,要求 data 在时钟上升沿之前至少保持稳定 1 个时间单位
$setup (data, posedge clk, 1);
endmodule
在这个例子中,$setup 用于确保在时钟上升沿发生之前,输入信号 data 已经稳定,至少保持 1 个时间单位。
当设计进行时序分析时,如果发现建立时间约束违规(data_event 发生在 reference_event time - limit 之前),工具会报告相应的错误或警告,以提示设计人员需要调整时序约束或电路设计
2、hold: $hold (reference_event, data_event, limit, notifier);
当reference_event time < data_event time < reference_event time + limit时,就会报告hold time violations
$hold (reference_event, data_event, limit, notifier);
reference_event:表示参考事件,通常是时钟的上升沿或下降沿,用于参照保持时间的时间基准。
data_event:表示需要满足保持时间约束的数据事件(通常是寄存器或信号的变化)。
limit:表示保持时间的上限,即在参考事件发生之后,数据事件必须在指定的时间内保持稳定。
notifier:是一个可选参数,用于指定一个任务或过程,以便在发生违规时进行通知。
例如,以下是一个示例
module example (
input wire clk,
input wire data,
output reg result
);
always @(posedge clk) begin
// 假设 result 寄存器在时钟上升沿变化
result <= data;
end
// 设置保持时间约束,要求 data 在时钟上升沿之后至少保持稳定 1 个时间单位
$hold (posedge clk, data, 1);
endmodule
在这个例子中,$hold 用于确保在时钟上升沿发生之后,输入信号 data 已经稳定,至少保持 1 个时间单位。
当设计进行时序分析时,如果发现保持时间约束违规(data_event 发生在 reference_event time + limit 之后),工具会报告相应的错误或警告,以提示设计人员需要调整时序约束或电路设计。
3、setup/hold:$setuphold (reference_event, data_event, setup_limit, hold_limit, notifier);
s
e
t
u
p
h
o
l
d
是
setuphold是
setuphold是setup和$hold两者的联合。例如:
$setuphold (posedge clk, negedge d, 2, 1, notifier);
(建立时间最小为2,保持时间最小为1。
d的下降沿时刻最晚需要在 clk的上升沿 - 2 时刻到来,否则报违例。
d的下降沿需要在 clk的上升沿到来之后最少保持 1 个时间单位,否则报违例。)
等于
$setup (negedge d, posedge clk, 2, notifier); 和 $hold (posedge clk, negedge d, 1, notifier);
数据事件常常是数据信号,而参考事件常常是时钟信号。
$setuphold (reference_event, data_event, setup_limit, hold_limit, notifier);
reference_event:表示参考事件,通常是时钟的上升沿或下降沿,用于参照建立时间和保持时间的时间基准。
data_event:表示需要满足建立时间和保持时间约束的数据事件,通常是数据信号的变化。
setup_limit:表示建立时间的上限,即在参考事件发生之前,数据事件必须已经稳定。
hold_limit:表示保持时间的上限,即在参考事件发生之后,数据事件必须在指定的时间内保持稳定。
notifier:是一个可选参数,用于指定一个任务或过程,以便在发生违规时进行通知。
下面是一个示例
module example (
input wire clk,
input wire data,
output reg result
);
always @(posedge clk) begin
// 假设 result 寄存器在时钟上升沿变化
result <= data;
end
// 设置建立时间和保持时间约束
$setuphold (posedge clk, negedge data, 2, 1, notifier);
endmodule
在这个例子中,$setuphold 用于同时设置建立时间和保持时间约束,确保在时钟上升沿发生之前,数据信号 data 已经稳定,并且在时钟上升沿之后保持稳定。这有助于确保逻辑门在正确的时间点对输入进行采样,以避免时序违规。
在时序分析中,如果发现建立时间或保持时间约束违规,工具会报告相应的错误或警告,以提示设计人员需要调整时序约束或电路设计。
4、recovery:$recovery (reference_event, data_event, limit, notifier);
当data_event time - limit < reference_event time < data_event time时,就会报告recovery time violations。
$recovery (reference_event, data_event, limit, notifier);
reference_event:表示参考事件,通常是某个时钟的上升沿或下降沿,作为时间基准。
data_event:表示需要满足恢复时间约束的事件,通常是某个数据信号的变化。
limit:表示恢复时间的上限,即在参考事件发生之后,数据事件必须在指定的时间内发生。
notifier:是一个可选参数,用于指定一个任务或过程,以便在发生违规时进行通知
module example (
input wire clk,
input wire data,
output reg result
);
always @(posedge clk) begin
// 假设 result 寄存器在时钟上升沿变化
result <= data;
end
// 设置恢复时间约束,要求 data_event 在时钟上升沿之后至少发生 2 个时间单位
$recovery (posedge clk, negedge data, 2, notifier);
endmodule
在这个例子中,$recovery 用于确保在时钟上升沿发生之后,数据信号 data 的下降沿至少在 2 个时间单位内发生,以满足恢复时间约束。
当进行时序分析时,如果发现恢复时间约束违规(data_event 发生在 reference_event time - limit 之前),工具会报告相应的错误或警告,提示设计人员需要调整时序约束或电路设计。
5、removal: $removal (reference_event, data_event, limit, notifier);
当data_event time < reference_event time < data_event time + limit时,就会报告removal time violations。
$removal (reference_event, data_event, limit, notifier);
reference_event:表示参考事件,通常是某个时钟的上升沿或下降沿,作为时间基准。
data_event:表示需要满足去除时间约束的事件,通常是某个数据信号的变化。
limit:表示去除时间的上限,即在参考事件发生之前,数据事件必须在指定的时间内发生。
notifier:是一个可选参数,用于指定一个任务或过程,以便在发生违规时进行通知。
以下是一个简单的示例:
module example (
input wire clk,
input wire data,
output reg result
);
always @(posedge clk) begin
// 假设 result 寄存器在时钟上升沿变化
result <= data;
end
// 设置去除时间约束,要求 data_event 在时钟上升沿之前至少发生 2 个时间单位
$removal (posedge clk, negedge data, 2, notifier);
endmodule
在这个例子中,$removal 用于确保在时钟上升沿发生之前,数据信号 data 的下降沿至少在 2 个时间单位内发生,以满足去除时间约束。
当进行时序分析时,如果发现去除时间约束违规(data_event 发生在 reference_event time + limit 之后),工具会报告相应的错误或警告,提示设计人员需要调整时序约束或电路设计。
6、notifier);
r
e
c
r
e
m
是
recrem是
recrem是recovery和$removal两者的联合。
$recrem (posedge clr, posedge clk, 2, 3, notifier); 等于
$recovery (posedge clr, posedge clk, 2, notifier); 和 $removal (posedge clr, posedge clk, 3, notifier);
数据事件常常是时钟信号,而参考事件常常是控制信号。
$recrem (reference_event, data_event, recovery_limit, removal_limit, notifier);
reference_event:表示参考事件,通常是某个控制信号的上升沿或下降沿,作为时间基准。
data_event:表示需要满足恢复时间和去除时间约束的数据事件,通常是时钟信号的变化。
recovery_limit:表示恢复时间的上限,即在参考事件发生之后,数据事件必须在指定的时间内发生。
removal_limit:表示去除时间的上限,即在参考事件发生之前,数据事件必须在指定的时间内发生。
notifier:是一个可选参数,用于指定一个任务或过程,以便在发生违规时进行通知。
以下是一个简单的示例:
module example (
input wire clr,
input wire clk,
// 其他输入输出
);
// 设置联合恢复时间和去除时间约束
$recrem (posedge clr, posedge clk, 2, 3, notifier);
// 其他模块逻辑
endmodule
在这个例子中,$recrem 用于同时设置联合恢复时间和去除时间约束,确保在控制信号 clr 上升沿发生之后,时钟信号 clk 的上升沿至少在 2 个时间单位内发生,并且在 clr 上升沿之前,clk 上升沿至少在 3 个时间单位内发生。
在时序分析中,如果发现恢复时间或去除时间约束违规,工具会报告相应的错误或警告,提示设计人员需要调整时序约束或电路设计。