最近在学习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;
56