现在开始我们假设要在Cadence的NC工具下,对一个VHDL的设计进行验证,那么就这样按部就班的一步步探索吧。
RTL编译和仿真
对于Cadence的工具来说,为人熟知的几个步骤就是ncvhdl, ncelab和ncsim。
ncvhdl是分析VHDL代码的句法和语义,如果没有错误的话,会生成HDL设计模块的内部表述,并且放置在指定的Library当中;
ncvlog是用于Verilog的编译指令,使用-sv可以编译SystemVerilog 文件。
ncelab则是独立于语言的工具(verilog或者VHDL进经过前一步之后,都被转化成同意的内部表述),它负责整个结构树的生成、连接、初值计算等等。关于前文提到的一些配置和entity的对应也应当是在这一步绑定的。经过这一步,生成的snapshot就被存放在database文件中了。
ncsim则很好理解,利用前面生成的目标文件进行仿真。
对于这几个命令的详细信息,可以参看ius的帮助文档,有非常详尽的说明。
对于我们想要进行的混合仿真来说,实际上思路很清晰,无非是对不同语言的文件用各自的语言编译器来编译,然后用独立于语言的ncelab来elaborate,最后进行仿真。这一点无论是哪一家Vendor都是殊途同归的。当然,要混仿,一般EDA TOOL都会要求编码时,需要满足一定的rules。而利用SystemVerilog构造顶层Testbench来包住VHDL的DUT,进行测试,是我们的目的。
Verification Keys
所谓验证语言的基本问题,在我看来无非就是验证环境如何与RTL代码之间实现互动?包括信号驱动、检测,包括Scope问题。
那么假设我们已经将VHDL的简单模块dut放置在了一个top的SystemVerilog的环境当中,那么如何回答上面的问题?
简单的演示如下:
vhdl的dut代码:(top.vhdl)
1 entity top_vhdl is
2 port (
3 dut_a: out bit_vector (3 downto 0)
4 );
5 end ;
6 architecture u_top of top_vhdl is
7 signal reg_a: bit_vector (3 downto 0);
8 begin
9 test_process: process
10 begin
11 dut_a <= “1100″;
12 wait for 10 ns;
13 dut_a <= “1101″;
14 wait for 10 ns;
15 dut_a <= “0011″;
16 reg_a <= not reg_a;
17 –assert false report “END of SIM” severity note;
18 –wait;
19 end process test_process;
20 end u_top;
非常简单,一个随便赋值了两下的模块。
接下来是一个更简单的verilog的dut模块:(top_verilog.sv)
1 module top_verilog;
2 reg verilog_bit;
3 initial begin
4 forever begin
5 verilog_bit = 1′b0;
6 #100
7 verilog_bit = ~verilog_bit;
8 end
9 end
10 endmodule
不停翻转的一个bit。
然后是包裹着着两个dut的testbench:(top.sv)
1 `timescale 1ns/100ps
2 module top_test;
3 reg [3:0] v_bits;
4 top_vhdl u_vhdl(
5 .dut_a(v_bits)
6 );
7
8 top_verilog u_verilog();
9
10 always @(v_bits) begin
11 $display(“vhdl’s value is %0x.”, v_bits);
12 end
13 always @(u_verilog.verilog_bit) begin
14 $display(“verilog’s value is %0b.”, u_verilog.verilog_bit);
15 end
16 demo_pro u_pro();
17 endmodule
18
19 program demo_pro;
20 initial begin
21 $display(“In first initial:”);
22 @(top_test.u_verilog.verilog_bit);
23 $display(“hit one toggle!”);
24 #100
25 $finish();
26 end
27 endprogram
这里我特意区分开了对verilog和VHDL的dut的信号的引用方式,从这里不难看出,Program中的验证代码部分可以按照hierarchy直接访问到Verilog的模块的内部信号,而对于VHDL的这种情况的访问却只能到port为止,就如同Vera时期的情况类似,信号交互都是发生在Port上,所以这在使用上需要注意。
到此为止,一段VHDL的代码已经被正确的import到了SystemVerilog当中,剩下的事情,就和普通的验证流程相仿,无论是要使用OVM/VMM等等,那就同等处理即可,还是相当简单的。
而执行以上步骤的命令行如下:
ncvhdl top.vhdl;
ncvlog top.sv top_verilog.sv;
ncelab worklib.top_test:module;
ncsim worklib.top_test:module;
小结
按照同事的看法,VHDL这种语言必然会死掉,正确与否先不讨论,但是使用起来,针对SV的隔离感还是存在的,希望以后工作中间能够有更多的体会和解决的办法。