EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在对asic设计进行FPGA原型验证时,由于物理结构不同,asic的代码必须进行一定的转换后才能作为fpga的输入。现代集成电路设计中,芯片的规模和复杂度正呈指数增加。尤其在asic设计流程中,验证和调试所花的时间约占总工期的70%。为了缩短验证周期,在传统的仿真验证的基础上,涌现了许多新的验证手段,如断言验证、覆盖率驱动的验证,以及广泛应用的基于现场可编程器件(fpga)的原型验证技术。 采用fpga原型技术验证asic设计,首先需要把asic设计转化为fpga设计。但asic是基于标准单元库,fpga则是基于查找表,asic和fpga物理结构上的不同,决定了asic代码需要一定的修改才能移植到fpga上。但应该注意到这只是由于物理结构不同而对代码进行的转换,并不改变其功能,因此对代码的这种修改只能限制在一定范围内。 基本原理 - 基于fpga原型验证的流程4 [+ I5 y H- K
$ \, g/ o5 o0 v$ w) x1 ]. W 由于fpga的可编程特性,基于fpga的原型技术已经被广泛采用。和仿真软件相比,fpga的硬件特性可以让设计运行在较高的频率上,加速仿真。另一方面,可以在asic芯片设计前期并行设计外围电路及应用软件,缩短了芯片验证周期。
1 J' i5 Z, q" A4 |9 B/ @2 ]# m, ^) }+ I6 B$ J$ G
fpga原型验证和其他验证方法是不同的,任何一种其他验证方法都是asic验证中的一个环节,而fpga验证却是一个过程。由于fpga与asic在结构、性能上各不相同,asic是基于标准单元库,fpga用的是厂商提供的宏单元模块,因此首先要进行寄存器传输级(rtl)代码的修改。然后进行fpga器件映射,映射工具根据设置的约束条件对rtl代码进行逻辑优化,并针对选定的fpga器件的基本单元映射生成网表。接着进行布局布线,生成配置文件和时序报告等信息。当时序能满足约束条件时,就可以利用配置文件进行下载。如果时序不能满足约束,可通过软件报告时序文件来确认关键路径,进行时序优化。可以通过修改约束条件,或者修改rtl代码来满足要求。 - 需要转换的代码' {6 s( E% `9 ~: H6 z5 t3 J
; t3 G* F% x$ y4 z" J4 V& a4 E
代码转换的实现 结合同济大学微电子中心的“32位高性能嵌入式cpu开发”项目,为了在流片之前确保功能的可靠性,对32位全定制高性能嵌入式cpu bc320进行了原型验证。 设计采用memec design公司的ff1152开发板。该板使用了xilinx的virtex-ⅱ pro系列芯片中的xc2vp30。该fpga拥有30 816个逻辑单元,相当于有30多万的asci门。另有2mb的片上block ram,644个i/o口。采用了xilinx的全自动、完整的集成设计环境ise 7.1i,进行fpga综合使用的工具是synplify pro。 用bc320的asic rtl代码作为fpga的输入,具体的代码转换如下。 - 存储单元
$ q: X8 |4 M" y. J% i E
8 P6 b7 d$ R0 ~# f8 _. \4 O$ s# k/ ?8 K 设计中用到了很多sram,例如icache中的sram。在fpga实现时根据所需ram的宽度、深度和功能来决定采用哪种单元来进行替换。xilinx提供了片外ram、block ram和lut ram。
" Z3 M5 D, f" C) L% J5 O/ p
3 ]5 d5 y0 T( G: _0 r+ Cise提供了两种具体的实现方法:ip生成器(core generator)和语言模板(language templates)。ip生成器是xilinx fpga设计中的一个重要设计输入工具,它提供了大量xilinx和第三方公司设计的成熟高效ip核。; Y' T, O3 t& ]# g. f+ n5 l" H
: N5 L! l$ m/ y. k2 p6 {! q1 a5 j* n 这里是用core generator来产生了名为块存储器(block memory)的单口存储器模块。core generator用图形化设置参数的方式来提供块存储器,其界面如图5所示。块存储器的大小根据向量的大小来制定,一个普通单元向量只需要4个512×32bit的块存储器就够了。core generator产生块存储器时,除了参数设置外,还需要输入一个为.coe的文件来初始化块存储器的内容。core generator产生的文件同时考虑了后端执行和仿真两方面,主要有三个文件:file.v,file.mif,file.edn。其中.v文件为verilog格式的sram仿真模型; .mif文件为作为其初始化内容,其内容和.coe文件里的具体向量内容是一致的;而实际后端文件为.edn,包含了块存储器的全部信息。 {7 q [1 B. a. m" [( k2 z& z5 h
( {- r8 ?5 t* f1 [! m![]()
) B8 z( m7 Q+ Y, _0 r图5 ip生成器的界面
! T9 x6 z" E8 f1 U5 d# o
, L8 L5 V9 f6 f( j. O" T7 a language templates主要利用xilinx的块存储器元件库,直接进行调用。xc2vp30内部的单口块存储器型号主要有:16k×1bit、1k×16bit、2k×8bit、4k×4bit、512×32bit、8k×2bit。可以根据自己的需要随意调用这些模块,在rtl代码中实例化,并把sram初始值作为参数传递进去。这些模块在synplify pro中根据选定的fpga型号被自动识别,然后综合成统一的.edn文件,再进行后续操作。语言模板方式的灵活性比较强,可以设置多个不同位宽,不同深度的块存储器,仿真也比较方便,但是参数设定时,sram初始值的设置比较麻烦。
0 O W1 M" @ Y
/ {. T- _ q8 w3 c" j7 o 另外,xilinx提供工具data-mem,它可以每次只改变fpga中块存储器的内容,而不需将整个设计重新翻译、映射和布局布线,为大量的向量验证节约了时间。 - 时钟单元
7 h, U7 a0 V. \. I6 I+ I1 x5 A/ G2 F/ U8 C- x% ^+ s4 Q: e! H/ |
在bc320设计中,cpu内核通过sysad接口与外部sram连接。这些外部sram的时钟和主时钟是不一致的,在asic中,用一个pll来实现。这个pll模块是无法用synplify pro综合的,在fpga上必须将它用xilinx的数字时钟管理模块(dcm)来替换。同样可以利用core generator和language templates这两种方法。& V0 E0 l) W; M- p5 G
; H, B+ y6 ]3 `& F
利用core generator产生mydcm.v文件来代替原先的pllgs_500.v,代码如下。第二段代码是修改后的代码。
* Q; h A2 c% ~# c+ G I9 F0 x4 w) k- |% K2 E7 E2 s$ t
module pllgs_500( pll_k,
- u( q1 J& d2 Opll_m," y5 |: e; x! |
pll_n,
$ w" h& J$ o8 d* h7 c; W. \" tpll_pd,
% O! B% B/ _: \* t5 B9 l3 npll_tst,) o2 D8 w# x6 U1 |3 N
reset,: F5 C- m3 `; u. `- a6 }: P' l
xin,2 x2 h1 j# [; S4 s
clk_out,! r( [3 E. \* e/ t
tst_out);
- R! r/ P$ c- n7 l y8 o9 F# m' G0 ~# h) e- v* J
module mydcm(clkin_in,. ]* u3 G6 K" Y. T8 G, X
rst_in,; m5 K) x. j& V5 e# n: r
clkfx_out,* D o d( p+ V; M
clkin_ibufg_out,- Z6 v& X; h! E' t& p& M
locked_out); - 时钟使能带代替门控时钟) _* D) {) A5 W2 ~8 @2 j8 E; Z
7 I1 W( M4 I& ^5 a. d3 \
把实现门控时钟信号转换成实现使能信号,例如信号pcepl,代码如下。第二段代码是修改后的代码。
- C9 V% K/ q4 ^: U# T4 r K. p4 A# B9 V: O4 [, T& o& {, S" Z; W
module(out,in,clk, pcepl);/ X3 E% J& j1 j$ |& a
……
1 C5 K6 O5 ~) K) kalways @ (clk or pcepl)# C2 S. q2 m3 d( a+ J
assign pceplv = pcepl & clk;
2 r( y) z+ h/ [" N6 ~always @(posedge pceplv)
' X5 W$ u0 B8 l7 Zbegin# u `$ L& Q i1 D; N; u& a
out <= in;3 U! c, g$ B$ U+ l g/ a
end% d/ e9 J% R0 e2 M$ i
endmodule
5 e: c T' D) X! g+ a+ @
& z5 j( m1 `, F3 o0 O Tmodule(out,in,clk, pcepl);
/ L; b/ C. _* R……& b+ ~" ]' u3 d, t
always @(posedge clk)
1 D# `; ^" [4 d8 M/ S- G3 hbegin
' Z, G* o8 o, q$ o2 o ~& m6 pif (pcepl)6 R* J$ o! `: B
out <= in;' h3 V; `9 N9 j
else4 o2 l2 v/ H9 i: \; D. u9 B4 G
out <= out;
5 y1 l9 e! k- R$ xend
( \( B- l, e5 ~endmodule - 外部器件配置单元和顶层封装
# Z9 G" }9 B3 h; v# k; \1 z1 \
+ _" z% q! S5 M6 \4 A- @ 在ff1152开发板上集成了很多接口和器件,在原型验证时,可以充分利用这些接口和器件做为和设计的交互环境。这些接口和器件需要正确配置后才能正常工作,这部分配置工作可以用fpga实现。) H1 s; t/ H7 A! [1 A# }
8 A c! d( |$ A 设计增加了lcd接口单元、内部记分牌(scoreboard)模块和通用异步串行接收发送(uart)模块。作为保存向量内容的sram设定好后,可以用同样的方法将寄存器参考值也保存在另外的块存储器中。然后运行cpu,将cpu实际产生的寄存器值和已保存过的参考值在记分牌模块中进行实时比较,然后将结果输出到lcd显示屏上。' o% M# i A: |# e8 S
: y7 P9 U( n. E* I+ E3 l8 k 为了便于代码的管理和维护,可以对原rtl代码进行一定的封装。将原asic流程的代码单独封装在一个模块中,再和fpga实现时添加的片外配置控制单元的代码一起形成新的fpga实现顶层。) z6 y8 [7 D/ t- ^$ ^9 t* i
, M1 n' A" ~6 r! D" U; t 所以在asic代码的基础上增加了对这几个器件完成配置工作的代码部分。
3 O$ D9 ?* E3 [8 {1 `
. @4 _: `% ^( t& D$ k! f/ @' d 为了原型系统获得更高的性能,还可以对其他一些模块的代码进行适当的改进,如算术单元和状态机的编码风格等。但对于全定制的cpu bc320,没有必要修改算术单元模块的代码,关键是存储模块和时钟单元。因此要根据自己的设计适当选择要修改的代码。
. k. n1 k+ ~' }- i! i5 I
/ e0 e# y9 l6 m( y( V0 Q; H; f9 L |