ci the auto_func_and_asy_reset

This commit is contained in:
leeyunlong 2025-06-12 11:12:41 +08:00
parent 499403192a
commit ca899e84a2
2 changed files with 120 additions and 1 deletions

View File

@ -175,7 +175,6 @@ check_rdc -module decode_address \
```
【Ref】
https://www.synopsys.com/zh-cn/verification/static-and-formal-verification/spyglass/spyglass-lint.html
https://www.synopsys.com/zh-cn/verification/static-and-formal-verification/vc-formal.html

View File

@ -0,0 +1,120 @@
@[TOC]()
# 1 function中的automatic VS static
在SV/Verilog中的的function声明动态automatic使用场景
automatic关键字主要是用于解决递归调用和并发执行时候的变量存储问题
首先可综合与不可综合等是和这个automatic关键字是没有关系的该关键字只是用于跑仿真时的函数体变量存储位置情况
## 1.0 关键特性对比
存储类型Auto: 动态分配栈存储 Static静态存储--类似全局变量;
递归支持Auto:支持 Static不支持
并发调用安全:线程安全; Static可能数据竞争
初始化行为:每次调用独立初始化; Static保持上次调用状态
典型应用场景:递归/冲入调用; Static:状态保持的计算;
## 1.1 可综合function
原则可综合function一般是只能综合成纯组合逻辑
因此:
1.仅包含纯计算逻辑;
2.不包含时序语句(综合和仿真的时序语句:@(posedge),wati,#delay等
3.不包含时序控制语句;
好的实践:
```verilog
// 标注可综合属性
(* synthesize *)
function automatic checksum;
input xxx;
input xxx;
return checksum;
endfunction
```
## 1.2 使用场景
必须使用auto情况
1.函数会被多个并行进程调用;
2.需要保证每次调用独立性的计算逻辑;
使用Static情况
1.需要保持调用间状态的计算;
2.对仿真性能要求高的简单计算;
## 1.3 Demo
1.递归函数调用
```verilog
// 计算阶乘的递归函数
function automatic integer factorial;
input integer n;
if (n <= 1)
factorial = 1;
else
factorial = n * factorial(n-1); // 递归调用
endfunction
```
2.在多处并行调用的函数
```verilog
// 在多处并行调用的函数
function automatic int count_ones;
input [31:0] data;
count_ones = 0;
for (int i=0; i<32; i++)
if (data[i]) count_ones++;
endfunction
fork
a_out = count_ones(a_in); // 可能同时多处调用
b_out = count_ones(b_in);
join
```
## 1.4 小结
* automatic函数会占用更多内存因为每次调用都会创建新的变量副本
* SystemVerilog中默认所有函数都是automatic的
* 在Verilog-2001中需要显式声明automatic
当需要递归调用、并行安全或独立变量存储时使用automatic函数简单无状态的操作使用普通函数即可。
# 2 不适用异步复位或完全不适用复位的场景及优势
**一般来说这不使用异步复位,是需要特别关注的,否则真的是把握不住,容易出问题**
但是经常会在IP上看到过比如S家C家和ARM的IP就经常会遇到
## 2.1 适用场景
### 2.1.1 数据通路寄存器
```verilog
// 流水线中间级寄存器,不需要复位
always @(posedge clk)
data_stage2 <= data_stage1; // 仅时钟驱动
```
### 2.1.2 时钟使能控制的寄存器
```verilog
// 仅通过时钟使能控制
always @(posedge clk) begin
if (clk_en)
data_reg <= new_data; // 不需要复位
end
```
### 2.1.3 状态保持寄存器
```verilog
(* no_reset *)
reg [3:0] history; // 历史记录寄存器
always @(posedge clk) begin
history <= {history[2:0], current_bit};
end
// 通过初始化赋值实现状态机复位FPGA适用
logic [3:0] state = 4'b0001; // 初始状态
always_ff @(posedge clk) begin
state <= next_state;
end
```
## 2.2 收益
1.时序收敛
减少复位信号带来的布线压力消除复位释放的恢复时间Recovery/Removal检查时序裕量提升10-15%
2.面设优化
减少复位树缓冲器Buffer和时钟门控单元
3.功耗降低
复位网络通常具有高负载,去除后可降低动态功耗;
3.减少复位毛刺引发的亚稳态