Overview
本文将介绍 soc 设计中 RTL-to-Netlist 映射及 RTL 中的信号名和 Netlist 中的信号名差异,
在 SoC设计中,RTL-to-Netlist映射 是从RTL(Register Transfer Level)代码转换为Netlist的过程。这通常涉及将用硬件描述语言(如Verilog或VHDL)编写的高层次设计转化为门级网络表,后者由逻辑门及其互连构成。以下详细说明这一过程及其常见的信号命名差异。
RTL-to-Netlist 映射过程
- 综合(Synthesis):
-
由EDA工具(如Synopsys Design Compiler、Cadence Genus等)将RTL代码转化为逻辑门级的描述。
-
RTL中的逻辑行为会被映射到目标工艺库的基本逻辑单元,如与门(AND)、或门(OR)、触发器(FF)等。
-
综合过程考虑了时序约束(timing constraints)、功耗优化、面积优化等因素。
- 优化(Optimization):
-
对逻辑单元进行重组、简化或门级优化,以满足设计约束。
-
包括扇出调整、逻辑折叠、路径延迟优化等。
- 信号名映射:
-
在RTL到Netlist映射中,信号名可能会由于工具生成机制而发生变化。
-
原因包括逻辑优化、资源共享、层级展平(flattening)或冗余信号移除等。
RTL与Netlist中信号名的差异*
差异原因
- 层级结构的展平:
-
RTL代码中常以模块化设计,信号名保留其模块名层级。
-
在Netlist中,为了方便优化和分析,工具可能将设计展平(flattening),信号名因此丢失层级信息或以新规则命名。
例子:
// RTL 中的代码
module top();
wire a;
submodule u1(.b(a));
endmodule
module submodule(input b);
wire c;
assign c = b & 1'b1;
endmodule
信号名变化:
-
RTL:
top.u1.b
-
Netlist:
u1_b
或top_b
- 逻辑优化或重命名:
-
在综合过程中,冗余信号可能被优化掉或重新命名。
-
工具也可能根据逻辑用途生成新名。
例子:
// RTL 中的信号
wire temp_signal = input1 & input2;
综合后若 temp_signal
被优化:
Netlist中可能直接消失或者映射为内部信号:
net_12345
- 资源共享的信号变更:
- 多个实例化模块或信号可能因共享逻辑单元而合并,信号名发生变化。
- 时钟、复位信号的重命名:
- 工具为时钟/复位等全局信号添加特定前缀或后缀,例如
clk_
或reset_
。
常见的映射规则
-
如果不展平层级,Netlist信号名通常是
顶层模块名.子模块名.信号名
。 -
如果展平层级,Netlist信号名常以
实例名_信号名
格式表示。 -
临时信号、优化信号可能生成伪随机ID名,如
net1234
。
具体信号映射实例
例子:简单寄存器
RTL代码:
module example(input clk, input rst, input d, output reg q);
always @(posedge clk or posedge rst) begin
if (rst)
q <= 1'b0;
else
q <= d;
end
endmodule
Netlist映射:
DFF_X1 q_reg ( // D触发器实例
.D(d),
.CK(clk),
.Q(q)
);
信号映射:
-
RTL 信号名:
q
-
Netlist 信号名:保持
q
或自动重命名为q_reg_Q
。
例子:优化过程的差异
RTL代码:
assign out = a & b & c;
优化后Netlist:
NAND3_X1 U1 (.A1(a), .A2(b), .A3(c), .ZN(net_5678));
INV_X1 U2 (.A(net_5678), .ZN(out));
信号映射:
-
RTL 信号名:
out
-
Netlist 信号名:逻辑分解后可能引入中间信号
net_5678
。
小结
-
在RTL到Netlist映射中,信号名差异主要由层级展平、逻辑优化和工具重命名规则引起。
-
理解信号的功能和工具生成规则,可以更方便地在两者间导航。
-
可以通过保存综合报告或启用工具设置来保留更多可追踪性信息,例如
-keep_hierarchy
参数或信号标签文件。