ci the auto_func_and_asy_reset
This commit is contained in:
parent
499403192a
commit
ca899e84a2
|
@ -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
|
||||
|
|
|
@ -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.减少复位毛刺引发的亚稳态
|
Loading…
Reference in New Issue