Ubuntu下Icarus的iverilog+gtkwave的FPGA波形仿真

iverilog+vvp+gtkwave相当于modelsim等波形仿真工具,iverilog+gtkwave完全免费,但是modelsim软件需要破解。
iverilog运行于终端模式下,安装完成之后通过iverilog执行编译,生成的文件通过vvp执行仿真,配合gtkwave可以实现图形化的波形显示查看。
本文章演示Icarus的iverilog+gtkwave的安装和基本的软件仿真使用。

1安装iverilog+gtkwave

第一步

sudo apt-get install iverilog

第二步

sudo apt-get install gtkwave

安装完成后我们可以使用

which iverilog
which vvp
which gtkwave

来查看是否安装成功。

2 编写verilog测试文件

第一步(未安装vim的安装vim)

sudo apt-get install vim

第二步 vim 创建文件

vim dds_rom.v
`timescale 1ns / 1ps

module dds_rom(
       input                    clk,
       input [9:0]              addr,//0-1023 1T
       output signed [31:0]     sin,
       output signed [31:0]     cos
       );

wire signed [31:0] dds_rom[0:1023];
wire [9:0] cos_addr;
assign cos_addr = addr+10'd256;
assign sin = dds_rom[addr];
assign cos = dds_rom[cos_addr];
......

编写测试顶层文件

`timescale 1ns / 1ps
`define NULL 0
module tb_dds();

parameter KHZ1 =44;
parameter KHZ2 =22;
parameter KHZ4 =11;
reg clk; 
initial begin 
  clk = 0; 
  #313333 clk = 0; 
  forever #11.072 clk = ~clk; 
end//45.1584MHZ

reg reset_n; 
initial begin 
  reset_n = 1; 
  #10000 reset_n = 0; 
  #100000 reset_n = 1; 
end 

reg [9:0] addr;
reg [9:0] cnt;
reg [31:0] k;
integer fb;

wire signed [31:0]     sin;
wire signed [31:0]     cos;

//Phase accumulation controller
always @(posedge clk or negedge reset_n) begin
  if(!reset_n) begin
      addr <= 0;
      cnt  <= 0;
    end
  else if(cnt == KHZ1-1) begin
    cnt <= 0;
    addr <= addr +10'd1;
  end
  else begin
    cnt <= cnt + 1;
    addr <= addr;
  end
end

//reg [8:0] i;//88.2khz
reg [9:0] i;//44.1khz Sample rate
reg signed [31:0] sin_slow;
reg signed [31:0] cos_slow;

always @(posedge clk or negedge reset_n) begin
  if(!reset_n) begin
    i <= 0;
    sin_slow <= 0;
    cos_slow <= 0;
    k <=0;
  end
  else begin
    i <= i+1;
    if(i == 0) begin
      sin_slow <= sin;
      cos_slow <= cos;
      k <= k +1;
      $display("sin=%d",sin);
      if(k == 8192) begin 
        $finish;
    end
    end
  end 
end 

initial $monitor("At time %t, sin = %d", $time, sin);

initial
  begin
    $dumpfile("UDDS.vcd");
    $dumpvars(0,UDDS);

    #1500000000 $finish;     //1.5
  end
endmodule
`include "dds_rom.v"

3iverilog+gtkwave波形仿真

第一步 编写shell自动化运行脚本

vim sin.sh

sin.sh内容

iverilog -o UDDS tb_dds.v
vvp -n  UDDS UDDS.lxt2
cp UDDS.vcd UDDS.lxt
gtkwave UDDS.lxt              

第二步 运行

bash sin.sh
仿真波形

欢迎关注微信公众号:FPGA开源工作室
获取更多学习资料。


FPGA开源工作室

你可能感兴趣的:(Ubuntu下Icarus的iverilog+gtkwave的FPGA波形仿真)