您的位置:

ncverilog使用详解

一、ncverilog教程

ncverilog是一个基于Verilog语言的仿真器,它可以用于设计验证、测试、调试电路,同时还支持RTL级别的设计(Register-Transfer-Level)。

ncverilog的使用参考手册非常详细,可以帮助用户完成从Verilog程序编写到仿真输出的全过程。

首先,在使用ncverilog前,需要编写好Verilog程序,并将其编译成VCD文件。下面给出一个简单的Verilog程序以及它的编译命令:

module test(input clk, output reg out);
always@(posedge clk)
   out<=~out;
endmodule

$ncverilog -q +access+r test.v -v /usr/local/synopsys/VERILOG/synopsys/vcsmx/D-2010.03-SP1-4/verilog_src/ovm-2.1.1/src/ovm_pkg.sv

其中,test.v为编写好的Verilog程序,-q选项表示只输出必要信息,+access+r选项表示以只读模式打开VCD文件并加载到仿真中,-v选项表示加载ovm_pkg.sv这个文件。

当上述命令执行成功后,即可通过ncverilog的仿真来验证程序是否正确。

二、ncverilog仿真命令

ncverilog提供了丰富的仿真命令,可以帮助用户进行各种测试、调试操作。

1. 准备工作

在进行仿真之前,需要设置仿真的时间范围、文件输出等信息。下面是一个设置仿真时间范围并输出仿真结果的例子:

initial begin
   $dumpfile("out.vcd");
   $dumpvars(0, test);
   $timescale 1ns/1ps;
   #1000 $finish;
end

其中,$dumpfile表示将仿真输出结果存放到out.vcd文件中,$dumpvars(0, test)表示输出模块test的所有信号,$timescale 1ns/1ps表示时间单位为1纳秒/1皮秒,#1000表示仿真时间为1000个时钟周期后结束。

2. 单步仿真

单步仿真可以在每个时钟周期或者每次事件的发生后暂停,方便用户调试验证。下面是一个单步仿真的例子:

initial begin
   // 设置仿真时间范围……
   // 定义一个命名时钟
   forever #5 clk=~clk;
   repeat(10) @(posedge clk);
     #5 $stop;
   $finish;
end

其中,forever #5 clk=~clk表示以5个模拟时间单位间隔切换clk的值,repeat(10) @(posedge clk)表示等待clk上升沿来临10次,#5 $stop表示在仿真执行到5个模拟时间单位时暂停仿真。

3. 接口测试

接口测试是ncverilog支持的一个重要功能,可以用于验证协议是否符合规范。下面是一个接口测试的例子:

// 设置仿真时间范围……
// 定义一个aster接口实例
interface aster(
   input logic clk,
   input logic[7:0] data_in,
   output logic[7:0] data_out
);
  // 定义tx、rx信号
endinterface

// aster接口设备
module aster_device(aster.ifc aster_inst,
                    input logic rx_done,
                    input logic reset);

  // 添加任务
  task test();
    aster_inst.data_in <= 8'hFF;
    @(posedge aster_inst.clk) aster_inst.data_out;
    // 比较aster_inst.clk和aster_inst.data_out的值并输出结果
  endtask

  // 定义initial块
  initial begin
    #5 test();
    $finish;
  end
endmodule

// 顶层模块
module top;
  aster.ifc aster1();
  aster_device aster_dev(aster1, rx_done, reset);
endmodule

其中,interface定义了aster的接口信号,module定义了aster设备,并在initial块中调用了test任务。通过运行上述代码,就可以进行aster接口测试了。

三、ncverilog和irun

ncverilog和irun都是Verilog的仿真器,它们的区别在于irun提供了更强大的调试和分析功能,并且与其他工具的兼容性更好。下面是ncverilog和irun的代码示例:

ncverilog代码示例:

module test(input clk, output reg out);
always@(posedge clk)
   out<=~out;
endmodule

$ncverilog -q +access+r test.v

irun代码示例:

module test(input clk, output reg out);
always@(posedge clk)
   out<=~out;
endmodule

irun -access rwc test.v

其中,irun的-access rwc选项表示将所有信号都设为可读/写/覆盖模式。此外,irun还提供了多线程仿真、覆盖率分析、代码覆盖率分析、波形形状分析等功能。

四、总结

本文对ncverilog的使用进行了详细的阐述,包括ncverilog教程、ncverilog仿真命令、ncverilog和irun等方面,旨在帮助读者更好地了解和使用ncverilog。