|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
引言
" W1 W- o* n3 I做IC验证时,除了采用SVA,DPI等验证手段,还可以采用svunit来实现module级别的验证。% t! `# z" v/ Z
" n s+ |" E1 ?, \+ y1,什么是svunit?
8 O& Z. s n+ d' m- I' D* y6 ESVUnit is a unit test framework for developers writing code in systemverilog. Verify systemverilog modules, classes and inteRFaces in isolation with SVUnit to eliminate bugs before they infest your design!
6 k$ _, l5 r5 k% _! P1 R3 S# j9 i& g3 T+ @+ [, M0 Q
2,svunit使用步骤
8 R( l- g8 Z) Z$ A- ~7 q" l" u1 N; b' K; e0 w+ b
2.1,下载最新svunit支持代码:v2.11
/ T/ R; x5 Y% o0 K: S/ m
0 D- b2 U) u% g8 |0 B! [2.2,解压:生成svunit-code目录
( N) x- O! U l; R* M& h8 ]' c
; ^" H. c2 P; W4 K8 R0 DTar -xvf svunit-v2.11.tar.gz
3 z9 e. ]( ]0 e. o$ ]9 D5 u6 ^7 S- q) M
2.3,按照README.txt操作,熟悉一下基本的构建过程$ C* j/ s! z+ K( ~% V3 c
$ A' ~0 j# [+ Z2 {! L% `0 H3,下面我们以一个加法器的例子来说明svnuit的用法
* ~4 }+ S7 l7 c8 L( _; a: E6 M% T( @% E( l
3.1,编写DUT:add.sv
! E5 u6 j" K. _1 o
$ N8 }7 M3 t1 t% L. g- /*
- * Rill for svunit test 2015-04-20
- */
- module add
- (
- input clk,
- input rst_n,
- input enable,
- input [3:0] a,
- input [3:0] b,
- output [7:0] sum
- );
- logic [7:0] sum_r;
- always_ff @(posedge clk)
- if(~rst_n | ~enable)
- sum_r <= 8'b0;
- else if(enable)
- sum_r <= a + b;
- assign sum = sum_r;
- endmodule:add
- " D( h/ Y4 @% O& o7 } P2 C& M* [7 m
; I* _ B6 c$ X
3.2,生成包装代码并添加激励和检查代码6 G! i# |" Q& e- o! ~( \( F
4 M/ V0 s# ~. c( \1 F
& J. F7 [5 ?) R% ]5 l
3 n( L0 i) \- Z, {/ i
- J5 U, H3 o% P9 f0 @% e& j7 g5 Z
1 [2 U F7 i: q; y/ ?" w" Z$ c6 I1 @8 f) k6 `
3.3,测试结果
* ?# ^( N. _/ P E9 r" ^/ B: \; ?! D$ \% H# M
2 H% A* o+ a V6 s
5 `9 N% {) B. w" j
P- q) |7 S/ j4 s/ V, ]
% W( ]* f6 {8 U5 C% m4 Q8 X! V7 h5 k; z
注:svunit的脚本主要是用Perl写的,所以需要主机上有perl语言库,如果出现类似“/perl command not found”的提示,说明你的主机上没有安装perl支持库,或者perl版本太旧,或者安装perl后环境变量没有指定正确。# r7 K( h( Z# e; G5 M1 I
! O9 t( {7 y) F1 A: u
4,附录:svunit使用步骤( ~; X9 ?$ o# C0 c" }, w
# z- m* H6 F& v7 m' K. b
1> 解压:tar -xvf svunit-v2.11.tar.gz- L* X" [! ~! t! g6 k" w' q
$ c4 p. [& H4 \9 V
2> mkdir my_svunit_test; cdmy_svunit_test4 I4 v) P _8 ~" ~' J
( ^& S! K+ p" ]. w4 B
3> touch add.sv并编辑
4 C& _1 x, M0 ~ I+ i& ` e+ u. a9 {, s; b' b1 d
4>复制Setup.bsh到my_svnuit_test,并修改SVUNIT_INSTALL路径,最后执行:source Setup.bsh
. O7 p! V3 H( F7 j
( O5 }* o; z( T8 e7 z5>生成封装文件:create_unit_test.pl add.sv( Q4 v: ?* q0 i6 `8 i* }
v+ h5 K+ b0 ~& G' U
6>编辑封装文件:add_unit_test.sv( \# c0 T7 M, o% O J! j+ l
! M! H8 N6 z _* E- Q/ \! l7>生成Makefile:create_svuit.pl) H: F! x0 b% O0 ~$ W( u
( @4 y, L2 _: |3 b. \8>指定使用的仿真工具:修改Makefile+ K1 F" i' q0 u
* j6 P4 V2 L. \3 l3 ]( x* F9>运行:make
3 x( F) g0 E J/ S
1 j( B$ I+ M: J8 M$ F. t5 T6 s: ~ Y& p9 m3 a* ]# f
5,小结; ?: `# J( j" G
9 C) o: L5 u3 @# f+ S csvunit的好处在于提供了几个脚本,可以自动将待测module进行自动封装,省去了一些编码工作。个人感觉目前svunit的功能还比较弱。每个SVTEST块实际是一个fork/join_any块,所有SVTEST块顺序执行。
3 b) |* w9 u: j1 H: s
; o b& |8 `( E3 Y( O! I$ l. I在实际的项目中可以通过三种方式使用svunit:3 a* G0 p n6 c
/ B: m. Q7 G b9 v; K! r$ X8 {# a 1>构建子模块测试流程,按照svunit提供的脚本,将主要子模块进行测试。模块的激励以及assert内容都需要自己加。. L/ k( O1 W9 E% a
2 q0 K4 \( _( X! `6 b
2>参考svunit的思想,针对主要模块的某部分代码(比如从某个文件的第100行到第200行),利用force/deposit作为激励,利用assertion作为检测手段,构建block测试流程。+ B+ n- U; z2 A) E
/ E" R7 O( }6 K: a/ g& b
3>将UVM和svunit结合使用。
* j8 O# Y* j; s6 t3 s" v6 }) G P
|
|