前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ubuntu下Icarus的iverilog+gtkwave的FPGA波形仿真

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

作者头像
FPGA开源工作室
发布2019-10-29 18:06:50
2.3K0
发布2019-10-29 18:06:50
举报
文章被收录于专栏:FPGA开源工作室FPGA开源工作室

iverilog+vvp+gtkwave相当于modelsim等波形仿真工具,iverilog+gtkwave完全免费,但是modelsim软件需要破解。

iverilog运行于终端模式下,安装完成之后通过iverilog执行编译,生成的文件通过vvp执行仿真,配合gtkwave可以实现图形化的波形显示查看。 本文章演示Icarus的iverilog+gtkwave的安装和基本的软件仿真使用。

1安装iverilog+gtkwave

第一步

代码语言:javascript
复制
sudo apt-get install iverilog

第二步

代码语言:javascript
复制
sudo apt-get install gtkwave

安装完成后我们可以使用

代码语言:javascript
复制
which iverilog
which vvp
which gtkwave

来查看是否安装成功。

2 编写verilog测试文件

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

代码语言:javascript
复制
sudo apt-get install vim

第二步 vim 创建文件

代码语言:javascript
复制
vim dds_rom.v
代码语言:javascript
复制
`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];
......

编写测试顶层文件

代码语言:javascript
复制
`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自动化运行脚本

代码语言:javascript
复制
vim sin.sh

sin.sh内容

代码语言:javascript
复制
iverilog -o UDDS tb_dds.v
vvp -n  UDDS UDDS.lxt2
cp UDDS.vcd UDDS.lxt
gtkwave UDDS.lxt              

第二步 运行

代码语言:javascript
复制
bash sin.sh
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FPGA开源工作室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1安装iverilog+gtkwave
  • 2 编写verilog测试文件
  • 3iverilog+gtkwave波形仿真
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档