VCS基本仿真

这里记录三种仿真方式:

第一种是将verilog文件一个一个敲在终端上进行仿真;

第二种是将多个verilog文件的文件路径整理在一个文件中,然后进行仿真;

第三种是利用makefile文件进行仿真;

以8位加法器为例:

一位加法器:

复制代码
module fa(a, b, cin, sum, cout);
input a, b, cin;
output sum, cout;
assign {cout, sum} = a + b + cin;
endmodule

以一位加法器组成的4位加法器:

复制代码
module add4(a, b, cin, sum, cout);
input [3:0] a, b;
input cin;
output cout;
output [3:0] sum;
wire [3:1] c;

fa u1(a[0], b[0], cin, sum[0], c[1]);
fa u2(a[1], b[1], c[1], sum[1], c[2]);
fa u3(a[2], b[2], c[2], sum[2], c[3]);
fa u4(a[3], b[3], c[3], sum[3], cout);

endmodule

以4位加法器组成的8位加法器

复制代码
module add8(a, b, cin, sum, cout);
input [7:0] a, b;
input cin;
output cout;
output [7:0] sum;
wire c4, c8_0, c8_1;
wire [7:4] sum_0, sum_1;

add4 u1(a[3:0], b[3:0], cin, sum[3:0], c4);
add4 low_add(a[7:4], b[7:4], 1'b0, sum_0, c8_0);
add4 high_add(a[7:4], b[7:4], 1'b1, sum_1, c8_1);

assign sum[7:4] = c4?sum_1:sum_0;
assign cout = c4?c8_1:c8_0;

endmodule

testbench

复制代码
module addertb;
reg [7:0] a_test, b_test;
wire [7:0] sum_test;
reg cin_test;
wire cout_test;
reg [17:0] test;

add8 u1(a_test, b_test, cin_test, sum_test, cout_test);

initial
begin
  for (test = 0; test <= 18'h1ffff; test = test +1) begin
    cin_test = test[16];
    a_test = test[15:8];
    b_test = test[7:0];
    #50;
    if ({cout_test, sum_test} !== (a_test + b_test + cin_test)) begin
      $display("***ERROR at time = %0d ***", $time);
      $display("a = %h, b = %h, sum = %h;  cin = %h, cout = %h",
               a_test, b_test, sum_test, cin_test, cout_test);
      $finish;
    end
    #50;
  end
  $display("*** Testbench Successfully completed! ***");
  $finish;
end
endmodule

1.第一种:将verilog文件一个一个敲在终端上进行仿真:

在存在verilog文件的文件夹内,打开终端,输入以下命令

1.1 先进行编译:

复制代码
vcs fa.v addertb.v add8.b add4.v -l readme.log +v2k -debug_all

1.2 再进行仿真:

复制代码
./simv -l run.log

1.3 打开图形化界面DVE

复制代码
./simv -gui

1.4 在选中所有信号,再右键add to wave,再new wave view

1.5 最后输出波形

点击1处的小箭头,便有波形出现。使用2处的三个按钮(预览全局、放大和缩小)调整波形。在3处鼠标左键按住不动,左右拖动即可选取一个观察的时间范围。

  1. 第二种将多个verilog文件的文件路径整理在一个文件中,然后进行仿真

2.1 将verilog文件路径放在一个文件中,文件命名为file.f

复制代码
find -name '*v' > file.f
gvim file.f

2.2 再进行编译

复制代码
vcs -f file.f -l readme.log +v2k -debug_all

2.3 编译后,再进行仿真,图形化界面和输出波形与第一种方法类似

  1. 第三种是利用makefile文件进行仿真

3.1先编写makefile文件,文件名为simv

复制代码
.PHONY:com sim clean

OUTPUT = simv  

VCS = vcs -sverilog +v2k -timescale=1ns/1ns                             \
	  -debug_all							\
	  -o ${OUTPUT}							\
	  -l compile.log						\

SIM = ./${OUTPUT} -l run.log

com:
	${VCS} -f file.f

sim:
	${SIM}

clean:
	rm -rf ./csrc *.daidir *.log simv* *.key

3.2 再进行编译,打开终端,输入

复制代码
make com

3.3 再进行仿真,输入

复制代码
make sim

3.4 再打开图形化界面

复制代码
./simv -gui

参考资料:

新手教程01:逻辑仿真工具VCS的基础使用_vcs使用教程-CSDN博客

https://www.cnblogs.com/amxiang/p/16688581.html

相关推荐
an12321219 小时前
ARM嵌入式学习笔记:SPI通信协议详解
arm开发·笔记·学习
Because_of_Her111 小时前
dfs-洪水填充技巧
笔记·算法·深度优先·洪水填充
xzal1212 小时前
GESP Python笔记
笔记·python·算法
周玉奎先生12 小时前
CGM系列水泥基灌浆料型号参数解析及安庆重点工程应用匹配
经验分享·笔记·零售
海海不掉头发12 小时前
软件项目管理学习笔记-从软件危机到敏捷与DevOps
笔记·学习·devops
M78佐菲15 小时前
ARM学习笔记(12)
linux·arm开发·笔记·嵌入式硬件·学习
奇思妙想聪明勤奋的小羊15 小时前
ai-agent-book第五章:Coding Agent 与通用 Agent 学习笔记
人工智能·笔记·学习
优化Henry15 小时前
BBU与RRU光链路详解:从双纤一收一发到单纤双向
网络·笔记·学习·5g·tdd
yi01116 小时前
DAY17: LeetCode 139|单词拆分:从“把单词删掉”到用 DP 记录合法切口
人工智能·笔记·python·算法·leetcode·动态规划
璞致电子16 小时前
基于 AD9361 (PZSDR‑P201Pro) 软件无线电实战综述:从板卡选型、硬件平台升级到 GNU Radio QPSK 完整收发链路
经验分享·嵌入式硬件·fpga开发·软件无线电·sdr·璞致电子