Linux 运行vcs仿真命令,VCS使用以及命令行调试
最近在学习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使用以及命令行调试相关推荐
- 一个简单的makefile编写VCS仿真
一个简单的makefile编写VCS仿真 1 VCS简介 VCS是编译型Verilog模拟器,它完全支持OVI标准的Verilog HDL语言.PLI和SDF. VCS具有行业中较高的模拟性能,其出色 ...
- Makefile 脚本运行VCS仿真
LINUX学习笔记 Makefile 脚本运行VCS仿真 1. 文件 2. Makefile 脚本 3. 命令 1. 文件 tb.list: tesetbech文件目录 rtl.list:rtl代码文 ...
- Synopsys VCS仿真编译选项
VCS仿真编译选项 1. 扩展选项 2. 自带编译选项 1. 扩展选项 1. +vcs+line+wait:一直等待license. 2. +maxdelays/+mindelays:使用SDF文件中 ...
- VCS仿真和多个test用urg工具生成coverage文件verdi查看--转载
VCS仿真可以分成两步法或三步法, 对Mix language, 必须用三步法.我呢,因为运用都是简单的非mix language,所以经常用一步法,因为这样省劲,但是对于跑regression最好还 ...
- VCS仿真VHDL VERILOG混合脚本
IC小白有感于第一次参与的流片工程,总结了一下参与过程中的Makefile配置,以及一些环境配置,希望能够帮助到大家: 首先VCS要进行VHDL和VERILOG的混合仿真,在进行仿真VHDL时要配置s ...
- linux 64位vcs,求助,VCS在ubuntu 64位的问题
我在ubuntu 10.04LTS里面安装了VCS,启动VCS和DVE都可以,我编译verilog文件的时候出现如下错误. 我有两个文件,count.v 和count_tb.v,使用vcs count ...
- 用telnet+openocd+jtag_dpi+vcs仿真调试RISCV的cpu
目录 背景: 需要了解的基础知识,此处不做介绍: 如何连结和调试 一些中间过程需要关心,记录 背景: Server :tcl+telnet SW :openocd+JTAG_DP ...
- IC学习笔记20——VCS的使用(二)VCS仿真基础知识
VCS全程是 Verilog Compiled Simulator,其中包含PLI接口,可以调用C和C++一些程序.支持行为级描述.RTL(寄存器传输级)和Gate-level(门级:是RTL经过综合 ...
- VCS 仿真filelist文件生成
为了方便VCS仿真,需要生成一个filelist.f的文件 使用find命令可快速生成filelist.f find -name "*.v" >filelist.f 生成后的 ...
最新文章
- 64岁Python之父退休失败,正式加入微软搞开源
- 机器学习资料推荐 URL
- python分发包_Python 分发包中添加额外文件的方法
- .net3.5下使用LINQ递归算法实现简洁代码
- mysql配置管理器在哪_SQL Server 2008配置管理器在哪下载
- 代码抽象_如何通过抽象使代码更具可读性
- html获取子节点数量,css判断子元素个数
- shell变量的使用
- Python 中非常狗的一个坑(在 `a={1:2},`后面多了一个逗号,自动被判为 tuple 类型了)
- [Python]集合的交集,并集,差集
- windows7、windows8、windows10、xp系统下载安装包及教程(U盘制作、直接安装)
- Struts2 教程
- 2022年中青杯数学建模B题初步思路
- separating axis test——分离轴测试算法的实现
- Andorid Activity的本质是什么
- [单调栈 扫描线] BZOJ 4826 [Hnoi2017]影魔
- 美日开年第二场大演习,这是要给虎年定个调吗
- 搞懂这 9 个步骤,DNS 访问原理就明明白白了
- OCR技术3-大批量生成文字训练集
- 小米笔记本装linux教程视频教程,重新安装系统,小编教你小米笔记本怎么重装win10系统...