最近在学习VCS,现将VCS的一些使用心得记录下来。

VCS是synopsys的仿真verilog的仿真器。基于linux系统。有命令行模式和图形化模式。图形化模式是用的dve。

以串口verilog代码使用为例,进行VCS使用说明。

简要说明下该串口功能。该串口工作在波特率为115200,无奇偶检验位。一位停止位。当使能信号有效,就将8位数据发送出去,输出结束后,在将该数据读回来。即自发自收。

测试代码如下:

module ceshi_uart_test;

// Inputs

reg clk;

reg rst_n;

reg [7:0] in_data;

reg w_en;

// Outputs

wire [7:0] data;

wire tx_free;

wire rx_free;

// Instantiate the Unit Under Test (UUT)

ceshi_uart uut (

.clk(clk),

.rst_n(rst_n),

.in_data(in_data),

.w_en(w_en),

.data(data),

.tx_free(tx_free),

.rx_free(rx_free)

);

always #1 clk = ~clk;

initial begin

// Initialize Inputs

clk = 0;

rst_n = 0;

in_data = 8'h53;

w_en = 0;

// Wait 100 ns for global reset to finish

#100 rst_n = 1;

#50  w_en = 1;

#5   w_en = 0;

@(tx_free)

#50  w_en = 1;

#5   w_en = 0;

#100  $finish;

end

endmodule

顶层模块代码:

module ceshi_uart(

input clk,

input rst_n,

input [7:0] in_data,

input w_en,

output [7:0] data,

output tx_free,

output rx_free

);

wire  band_tick;

wire  [1:0] rx_state;

wire  [1:0] tx_state;

wire        txd_data;

bandrate_generate     //波特率产生模块。产生波特率时钟的16倍时钟

#(

.bandrate(19200)    //波特率

)bandrate_generate_1

(

.clk(clk),

.rst_n(rst_n),

.state(rx_state|tx_state),

.band_tick(band_tick)

);

uart_rx uart_rx_1 (     //接收模块

.clk(clk),

.rst_n(rst_n),

.rxd_data(txd_data),

.band_tick(band_tick),

.free(rx_free),

.data(data),

.rx_state(rx_state)

);

uart_tx uart_tx_1(    //发送模块

.clk(clk),

.rst_n(rst_n),

.w_en(w_en),

.band_tick(band_tick),

.send_data(in_data),

.free(tx_free),

.txd_data(txd_data),

.tx_state(tx_state)

);

endmodule

波特率产生模块

module bandrate_generate

#(

parameter bandrate = 9600

)

(

input clk,

input rst_n,

input [1:0] state,

output band_tick

);

//此处initial语句是可以综合的,因为是预先计算的。

/************* initial the bandrate    *******************/

reg[9:0] bandrate_number ;

initial  begin

case( bandrate )

4800:

bandrate_number = 650;

9600:

bandrate_number = 325;

14400:

bandrate_number = 216;

19200:

bandrate_number = 162;

38400:

bandrate_number = 80;

56000:

bandrate_number = 55;

115200:

bandrate_number = 26;

default:

bandrate_number = 352;

endcase

end

/************* end initial bandrate ****************/

localparam idle = 2'd0;

reg[9:0] bandrate_cnt ;

always@( posedge clk ) begin

if( !rst_n )

begin

bandrate_cnt <= 0;

end

else

begin

if( state == idle || bandrate_cnt == bandrate_number )

bandrate_cnt <= 0;

else

bandrate_cnt <= bandrate_cnt + 1'b1;

end

end

assign band_tick = (bandrate_cnt ==  bandrate_number);

endmodule

接收模块代码:

module uart_rx(

//input signal

input clk,

input rst_n,

input rxd_data,

input band_tick,

//output signal

output reg free,

output reg [7:0] data,

output [1:0] rx_state,

output reg finish

);

localparam idle    = 2'd0;

localparam start   = 2'd1;

localparam receive = 2'd2;

localparam stop    = 2'd3;

reg [1:0] state;

reg [1:0] state_next;

reg [7:0] rx_data;

reg [7:0] rx_data_next;

reg [3:0] n_reg;

reg [3:0] n_next;

reg [3:0] cnt_reg;

reg [3:0] cnt_next;

always@( posedge clk ) begin

if( !rst_n )

begin

state <= idle;

n_reg <= 0;

cnt_reg <= 0;

rx_data <= 0;

end

else

begin

state <= state_next;

n_reg <= n_next;

cnt_reg <= cnt_next;

rx_data <= rx_data_next;

end

end

always@ *  begin

n_next = n_reg;

cnt_next = cnt_reg;

state_next = state;

rx_data_next = rx_data;

finish = 0;

free = 0;

case( state )

idle:

begin

free = 1;

if( ~rxd_data )

begin

state_next = start;

cnt_next = 0;

end

end

start:

begin

if( band_tick )

if( cnt_reg == 15 )

begin

state_next = receive;

rx_data_next = 0;

cnt_next = 0;

n_next = 0;

end

else

cnt_next = cnt_reg + 1'b1;

end

receive:

begin

if( band_tick )

begin

if( cnt_reg == 7 )

rx_data_next = {rxd_data,rx_data[7:1]};

if( cnt_reg == 15 )

begin

cnt_next = 0;

if( n_reg == 7 )

begin

state_next = stop;

end

else

n_next = n_reg + 1'b1;

end

else

cnt_next = cnt_reg + 1'b1;

end

end

stop:

begin

if( band_tick )

if( cnt_reg == 15 )

begin

cnt_next = 0;

state_next = idle;

finish = 1;

end

else

cnt_next = cnt_reg + 1'b1;

end

default:

state_next = idle;

endcase

end

always@( posedge clk ) begin

if( !rst_n )

data <= 0;

else

begin

if( state == stop )

data <= rx_data;

else

data <= data;

end

end

assign rx_state = state;

endmodule

发送数据模块

module uart_tx (

input clk,

input rst_n,

input w_en,

input [7:0] send_data,

input band_tick,

output reg free,

output reg txd_data,

output [1:0] tx_state

);

// define serial_port state

localparam idle    = 2'd0;

localparam start   = 2'd1;

localparam send    = 2'd2;

localparam done    = 2'd3;

reg [1:0] state;

reg [1:0] state_next;

reg [3:0] n_reg;

reg [3:0] n_next;

reg [3:0] cnt_reg;

reg [3:0] cnt_next;

always@( posedge clk ) begin

if( !rst_n )

begin

state <= idle;

n_reg <= 0;

cnt_reg <= 0;

end

else

begin

state <= state_next;

n_reg <= n_next;

cnt_reg <= cnt_next;

end

end

always@ *  begin

state_next = state;

n_next = n_reg;

cnt_next = cnt_reg;

free = 0;

case( state )

idle:

begin

txd_data = 1;

free = 1;

if( w_en )

begin

state_next = start;

end

end

start:

begin

txd_data = 0;

if( band_tick )

begin

if( cnt_reg == 15 )

begin

state_next = send;

n_next = 0;

cnt_next = 0;

end

else

begin

cnt_next = cnt_reg + 1'b1;

end

end

end

send:

begin

txd_data = send_data[n_reg];

begin

if( band_tick )

begin

if( cnt_reg == 15 )

begin

cnt_next = 0;

if( n_reg == 7 )

state_next = done;

else

n_next = n_reg + 1'b1;

end

else

cnt_next = cnt_reg + 1'b1;

end

end

end

done:

begin

txd_data = 1;

if( band_tick )

begin

if( cnt_reg == 15 )

begin

cnt_next = 0;

state_next = idle;

end

else

cnt_next = cnt_reg + 1'b1;

end

end

default:

state_next = idle;

endcase

end

assign tx_state = state;

endmodule

一、VCS仿真

下面开始进行VCS仿真。

VCS要使用图形化界面,必须得先编译得到vpd文件,才能用图形化界面看波形。

首先是编译verilog文件。

主要命令如下

vcsverilog文件[-y搜索路径+libext+.v-debug_all –ncli]

其中[]中的选项是可选的。

-y搜索路径指定搜索目录

+libext+.v指定搜索后缀为.v的文件

-debug_all是调试用的,如果要进行调试,就要加这个命令。

-ncli是命令行ncli调试。

以上是主要的可选项,其余的自行百度。

我的文件目录如上所示,测试代码在当前目录下,其余的调用的模块代码在rtl目录下。

所以,要编译。用如下命令:

vcsceshi_uart_test.v-y ./rtl +libext.+v

就进行编译了。-y的作用就是指定搜索路径,因为有可能我们的verilog代码不都是在当前目录下,而是在一个文件夹里面。这样就可以用-y指定该文件夹,这样vcs编译的时候,就会去该目录下去寻找verilog文件。而+libext+.v是指在该搜索路径下,将顶层模块中用到的例化模块都给包括进来。

如果所有的verilog文件都在当前目录下,那么可直接执行

vcsa.v b.v c.v……(注意,testbench要放在最前面,因为testbench中有`timescale)

如果只是vcs ceshi_uart_test.v –y ./rtl就会有如下错误

提示测试文件中的例化模块找不到。

编译完成后,会在当前目录下,生成一个simv文件。这个文件是一个可执行文件,执行这个文件,就可以看到我们的仿真结果。

命令是./simv

因为在testbench中没有写显示内容,所以仿真结果是看不到显示结果的。

可以用dve查看波形。

命令./simv     -gui

可以看到会有错误,这是因为没有生成vpd文件。VCS的dve是执行vpd文件的。直接vcs verilog文件是不会产生vpd文件的。要加一个-debug_all或者-debug或者-debug_pp命令。不过推荐用-debug_all,因为这个可以加断点。

即vcsceshi_uart_test.v-y ./rtl +libext.+v-debug_all

然后再执行./simv -gui

就打开了dve。同时在当前目录下,产生了inter.vpd文件。

接下来的操作和一般的verilog仿真软件是一样的。选中信号加入到波形中,然后开始仿真。就可以看到波形了。

点击运行仿真

就可以看到波形了。

二、命令行调试

接下来是命令行调试。

命令行调试不用看波形,用命令,执行仿真,观看信号。命令行仿真是在ucli中进行的。所以在编译命令中,要加入-ucli。

使用命令行调试,可在testbench中加入$stop语句。这样仿真可以在该处停下来,这样可以查看各个信号的值。

如我再testbench中加入两个$stop语句。

执行命令vcsceshi_uart_test.v-y ./rtl +libext.+v-debug_all –ucli –R

-R表示编译后立即执行。

不加这个选项那执行完上个命令后,在执行命令./simv -ucli才启动ucli调试。

显示ucli就表示进入ucli调试了。

ucli中有一些常用命令,

scope显示当前的顶层模块

scope u1就表示进入到当前顶层模块的u1模块,同时将u1模块设置为顶层模块

scope -up回到目前顶层模块的上一层。

scope可以用来选择不同的模块,以此来显示不同的信号。因为show是显示当前顶层的信号以及子模块

show显示当前顶层模块的信号以及子模块

show-value信号-radix hex/bin/dec显示信号的值以特定的进制显示。

run运行仿真

run一直运行,直到遇到$stop或者设置的断点

runtime运行多少时间停止(不推荐)

run-posedge信号运行到信号的上升沿停止

run-negedge信号运行到信号的下降沿停止

run-change信号信号有变化时停止

stop设置断点

stop显示断点

stop-posedge信号在信号的上升沿设置断点

stop-negedge信号在信号的下降沿设置断点

stop-condition{信号表达式}信号表达式为真的地方设置断点

stop-delete断点值删除断点值的断点

restart重新开启ucli调试模式

-h帮助命令

命令后面接–h显示当前命令的帮助

如scope –h显示

接下来就开始调试

首先scope命令,显示当前顶层为ceshi_uart_test,即我们的testbench模块。

第二个命令show显示当前模块下有哪些信号和子模块。可看出,有7个信号,和一个子模块uut。即我们例化的uart_top模块。

第三个命令show -value显示信号的值,以16进制显示,因为还没有开始运行,所以信号的值都是x。不定值。

第四个命令scope uut进入到uut子模块。当前的顶层模块为uut

第五个命令show显示当前顶层模块uut的信号以及子模块,这里有11个信号,3个子模块。

执行scope -up回到顶层模块。

第六个命令run命令在56行有$stop,所以在该处,仿真暂停。

第七个命令show命令显示信号的值因为有些值还没有初始化,所以显示为x。

第八个命令show命令显示子模块uut中的信号。调用模块中的信号是用.调用的。

第九个命令设置断点1在clk的上升沿设置断点1

第十个命令设置断点2在clk的下降沿设置断点2

第十一个命令设置断点3在rst为1设置断点3

第十二个命令显示断点设置了三个断点,这里就显示3个断点

第十三个命令删除断点2删除在clk下降沿设置的断点2

第十四个命令显示断点删除掉了断点2这里就显示断点1和3

断点设置好后,接下来就run,show看信号就可以了。

使用restart可以重新开始调试。即仿真时刻回到0时刻。

每次show -value比较麻烦,可以使用alias var show -value用var代替show -value。

如果show -value信号就可以var信号

以上就是我目前学习到VCS的一些使用心得。当然VCS还有其他的一些命令,由于还没有接触到,这里也没有提到。

Linux 运行vcs仿真命令,VCS使用以及命令行调试相关推荐

  1. 一个简单的makefile编写VCS仿真

    一个简单的makefile编写VCS仿真 1 VCS简介 VCS是编译型Verilog模拟器,它完全支持OVI标准的Verilog HDL语言.PLI和SDF. VCS具有行业中较高的模拟性能,其出色 ...

  2. Makefile 脚本运行VCS仿真

    LINUX学习笔记 Makefile 脚本运行VCS仿真 1. 文件 2. Makefile 脚本 3. 命令 1. 文件 tb.list: tesetbech文件目录 rtl.list:rtl代码文 ...

  3. Synopsys VCS仿真编译选项

    VCS仿真编译选项 1. 扩展选项 2. 自带编译选项 1. 扩展选项 1. +vcs+line+wait:一直等待license. 2. +maxdelays/+mindelays:使用SDF文件中 ...

  4. VCS仿真和多个test用urg工具生成coverage文件verdi查看--转载

    VCS仿真可以分成两步法或三步法, 对Mix language, 必须用三步法.我呢,因为运用都是简单的非mix language,所以经常用一步法,因为这样省劲,但是对于跑regression最好还 ...

  5. VCS仿真VHDL VERILOG混合脚本

    IC小白有感于第一次参与的流片工程,总结了一下参与过程中的Makefile配置,以及一些环境配置,希望能够帮助到大家: 首先VCS要进行VHDL和VERILOG的混合仿真,在进行仿真VHDL时要配置s ...

  6. linux 64位vcs,求助,VCS在ubuntu 64位的问题

    我在ubuntu 10.04LTS里面安装了VCS,启动VCS和DVE都可以,我编译verilog文件的时候出现如下错误. 我有两个文件,count.v 和count_tb.v,使用vcs count ...

  7. 用telnet+openocd+jtag_dpi+vcs仿真调试RISCV的cpu

    目录 背景: 需要了解的基础知识,此处不做介绍: 如何连结和调试 一些中间过程需要关心,记录 背景: Server    :tcl+telnet SW         :openocd+JTAG_DP ...

  8. IC学习笔记20——VCS的使用(二)VCS仿真基础知识

    VCS全程是 Verilog Compiled Simulator,其中包含PLI接口,可以调用C和C++一些程序.支持行为级描述.RTL(寄存器传输级)和Gate-level(门级:是RTL经过综合 ...

  9. VCS 仿真filelist文件生成

    为了方便VCS仿真,需要生成一个filelist.f的文件 使用find命令可快速生成filelist.f find -name "*.v" >filelist.f 生成后的 ...

最新文章

  1. 64岁Python之父退休失败,正式加入微软搞开源
  2. 机器学习资料推荐 URL
  3. python分发包_Python 分发包中添加额外文件的方法
  4. .net3.5下使用LINQ递归算法实现简洁代码
  5. mysql配置管理器在哪_SQL Server 2008配置管理器在哪下载
  6. 代码抽象_如何通过抽象使代码更具可读性
  7. html获取子节点数量,css判断子元素个数
  8. shell变量的使用
  9. Python 中非常狗的一个坑(在 `a={1:2},`后面多了一个逗号,自动被判为 tuple 类型了)
  10. [Python]集合的交集,并集,差集
  11. windows7、windows8、windows10、xp系统下载安装包及教程(U盘制作、直接安装)
  12. Struts2 教程
  13. 2022年中青杯数学建模B题初步思路
  14. separating axis test——分离轴测试算法的实现
  15. Andorid Activity的本质是什么
  16. [单调栈 扫描线] BZOJ 4826 [Hnoi2017]影魔
  17. 美日开年第二场大演习,这是要给虎年定个调吗
  18. 搞懂这 9 个步骤,DNS 访问原理就明明白白了
  19. OCR技术3-大批量生成文字训练集
  20. 小米笔记本装linux教程视频教程,重新安装系统,小编教你小米笔记本怎么重装win10系统...

热门文章

  1. SEO学习的最好方式:搜索引擎
  2. 李一男离开华为时给属下的忠告
  3. java实现监听文件
  4. Apache Doris在作业帮实时数仓中的应用实践
  5. Dijkstra迪杰斯特拉算法的介绍(分为朴素dj和堆优化版dj),包含模板总结(必掌握)与具体例题应用
  6. gcc/g++ 编译C/C++代码
  7. CUDA:在NPP中直方图均衡化实例
  8. 大厂实习-字节跳动实习滴滴实习日记
  9. Java大数据基础——day01
  10. android+浏览器+主页,android 更改浏览器默认主页