iverilog+vvp+gtkwave相当于modelsim等波形仿真工具,iverilog+gtkwave完全免费,但是modelsim软件需要破解。
iverilog运行于终端模式下,安装完成之后通过iverilog执行编译,生成的文件通过vvp执行仿真,配合gtkwave可以实现图形化的波形显示查看。 本文章演示Icarus的iverilog+gtkwave的安装和基本的软件仿真使用。
第一步
sudo apt-get install iverilog
第二步
sudo apt-get install gtkwave
安装完成后我们可以使用
which iverilog
which vvp
which gtkwave
来查看是否安装成功。
第一步(未安装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"
第一步 编写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