Verilog语法_4(Modelsim自动化仿真)

September 22, 2016
作者:dengshuai_super
出处:http://blog.csdn.net/dengshuai_super/article/details/52620197
声明:转载请注明作者及出处。


Modelsim自动化仿真平台
Modelsim GUI仿真流程
1.打开Modelsim软件,建一个工程文件夹,简历Modelsim仿真工程。
2.在用户窗口界面加入需要仿真的所有代码和库文件。
3.编译所有文件
4.选择testbench顶层文件启动仿真。
5.选择所要观察的目标信号,并将其加入到波形观察窗口,如需更改bus显示数据格式还需要进一步设置。例如进制转换,模拟波形切换。
6.设置仿真运行时间,启动仿真波形绘制。
7.如果下一次启动有其他文件更改或删除还需要重复以上步骤的部分或者全部。

Modelsim do文件的自动化仿真
1.建立库
2.映射库到物理目录
3.编译源代码
4.启动仿真器
5.执行仿真

Modelsim do文件的自动化仿真Tcl语言的语法
vlib:创建库。格式vlib< library name >,默认库的名字为work
示例:vlib work
vmap:映射逻辑库名,将逻辑库名映射库路径。语法格式vmap work< library name >
示例:vmap work work
vdir:显示指定库的内容。语法格式vdir -lib < library name>
示例:vdir -lib work
vlog:编译Verilog源代码,库名缺省编译到work本地库,文件按顺序编译。
语法格式vlog -work < library name > < file1>.v < file2>.v
示例:vlog -work lpm 220model.v

//ex_shift_reg.v
module ex_shift_reg(
    input  wire  lvds_clk,//接口类似于LVDS的接口(标准的低电压差分信号,2.5v,主要用于远距离高速传输,通过差分线可以传输几十米,可以传输视频等高速信号),需要差分转成单端,现在假设已经把差分信号转成单端了
    input  wire  rst_n,
    input  wire  lvds_d,
    output reg [7:0] o_lvds_d//端口输出最好是寄存器,这是写模块的一个规范,优化时序
);

reg  [7:0]  shift_reg;//用储我们的串行转成并行的数据;假设是从1比特转成8比特
reg  [2:0]  s_cnt;
reg         s_flag;//以组合逻辑实现
reg         s_flag_dly1,s_flag_dly2;

//位拼接符,可以把不同位宽的数据拼接成一个变量。{7'b1010_000,3'b010}---->10'b1010_000_010;等效的。


always @(posedge lvds_clk or negedge rst_n)
                if(rst_n == 1'b0)
                        shift_reg <='d0;
                else
                         //shift_reg <={shift_reg[6:0],lvds_d};//左移位寄存器是把先进来的数据位
                        shift_reg <={lvds_d,shift_reg[7:1]};//右移位寄存器是把先进来的数据位
//第一个时钟周期{0000_000lvds_d1}
//第二个时钟周期{0000_00lvds_d1 lvds_d2}
//....
//第八个时钟周期{lvds_d1 d2 ...d8}

always @(posedge lvds_clk or negedge rst_n)
                if(rst_n == 1'b0)
                        s_cnt <= 'd0;
                else
                        s_cnt <= s_cnt + 1'b1;

always @(s_cnt)//组合逻辑如何写全敏感列表,1,条件列表里的所有变量,以及赋值语句右边的所有变量
            if(s_cnt == 3'd7)
                    s_flag<=1'b1;
          else 
                s_flag<=1'b0;//这个分支条件一定要写全,不然生成锁存器,锁存器在FPGA设计中是很危险的。因为延时时间不固定。

always @(posedge lvds_clk or negedge rst_n)
                if(rst_n == 1'b0)
                         o_lvds_d <= 'd0;
        else if(s_flag_dly2 == 1'b1)
                         o_lvds_d <=shift_reg;

always @(posedge lvds_clk)
             {s_flag_dly2,s_flag_dly1}<={s_flag_dly1,s_flag};//用位拼接符号实现寄存器打拍延时
endmodule
//tb_ex_shift_reg.v
`timescale 1ns/100ps
module tb_ex_shift_reg;
reg lvds_clock,rst_n;
reg [0:0] mem1x16 [15:0];//这是声明memory(存储器)变量 ,第一个方括号是位宽,第二个方括号是存储器深度

reg   lvds_d;
wire  [7:0]  o_lvds_d;
reg   [3:0] i_30;

initial begin
        lvds_clock =0;
        rst_n = 0;
        lvds_d=0;
        #90.1
        rst_n =1;
end

always #10 lvds_clock <=~lvds_clock;
initial begin//一上电执行一次
            $readmemb ("./data.txt",mem1x16);//双引号里是读取文件的路径
end 
initial begin
            #100
            lvds_send_d();
end
ex_shift_reg ex_shift_reg_inst(
        .lvds_clk      (lvds_clock),//接口类似于LVDS的接口(标准的低电压差分信号,2.5v,主要用于远距离高速传输,通过差分线可以传输几十米,可以传输视频等高速信号),需要差分转成单端,现在假设已经把差分信号转成单端了
    .rst_n         (rst_n),
    .lvds_d        (lvds_d),
    .o_lvds_d      (o_lvds_d) //端口输出最好是寄存器,这是写模块的一个规范,优化时序
);

task lvds_send_d();
            integer i;
            begin
                    for(i=0;i<255;i=i+1)
                    begin
                            @(posedge lvds_clock);
                            lvds_d <=mem1x16[i[3:0]];
                            i_30<=i[3:0];
                    end
          end
endtask
endmodule
#run.do
#ci此处是注释
#退出当前仿真功能
quit -sim
#清除命令行显示信息
.main clear
vlib ./lib
vlib ./lib/work
vmap work ./lib/work

vlog -work work  ./tb_ex_shift_reg.v
vlog -work work  ./../design/*.v
#设置优化参数进行启动仿真的,但是这个优化参数不会把我们的信号内部优化掉
vsim -voptargs=+acc work.tb_ex_shift_reg

#add wave -divider {tb_ex_shift_reg_111}

add wave tb_ex_shift_reg/lvds_clock
add wave tb_ex_shift_reg/rst_n
add wave tb_ex_shift_reg/lvds_d
add wave tb_ex_shift_reg/i_30
add wave -radix bin   tb_ex_shift_reg/o_lvds_d

#add wave -driver  {ex_shift_reg_inst_888}
#add wave 测试顶层的名字 /例化模块的例化名字 /信号的名字,*是通配符匹配所有的信号
add wave tb_ex_shift_reg/ex_shift_reg_inst/*

run 100us

在Modelsim先建立一个新Project,然后在底部命令窗口输入:
do run.do

Verilog语法_4(Modelsim自动化仿真)_第1张图片

s_flag_fly2 为高的时候,shfit_reg 正好为55

Verilog语法_4(Modelsim自动化仿真)_第2张图片

下一拍正好对应11


来源:
https://ke.qq.com/user/index/index.html#cid=66019&term_id=100056181

你可能感兴趣的:(FPGA)