在上一篇文中复制好库文件后:
在vivado中创建IP核。
在E盘的modelsim_project文件夹中建立testbench文件夹,run_simulation.bat文件,再将整个vivado工程复制过来,此时modelsim文件夹包括以下文件:
run_simulation.bat代码如下:
@echo off
@cls
title FPGA Auto Simulation batch script
echo ModelSim simulation
echo.
echo Press '1' to start pll_tb simulation ** pll_tb:可更改,改成建立的modelsim工程的文件名
echo.
:input
set INPUT=
set /P INPUT=Type test number: %=%
if "%INPUT%"=="1" goto run1
goto end
:run1
@cls
echo Start pll_tb Simulation; ** pll_tb:可更改,改成建立的modelsim工程的文件名
echo.
echo.
cd testbench/pll_tb ** cd:打开包含四个文件的文件夹modelsim工程的文件名
vsim -do "do compile.do"
goto clean_workspace
:clean_workspace
rmdir /S /Q work
del vsim.wlf
del transcript.
:end
testbench文件夹中包含compile.do、glbl.v、testbench_top.v、wave.do 4个文件:
只列出需要更改的文件具体内容:
- glbl.v文件是从vivado安装路径中复制的,路径: D:\vivado\Vivado\2019.2\data\verilog\src\glbl.v
- compile.do:代码如下:
### 这是注释 **需要更改的地方
vlib work ### vlib为Modelsim命令,work是一个新建的文件夹名称,该命令将在compile.do所在文件夹中新建一个名为work的物理目录
vmap work work ### vmap为Modelsim命令,后面两个work都是文件名,前面一个work是vlib命令所创建的文件夹,后面一个work表示在Modelsim的Library窗口中建立了一个名为work的库文件夹
vlog -work work glbl.v
#library(库)
### 所用的库已经编译好(即从vivado中复制过去的库文件)
#vlog -work work ../../library/artix7/*.v
#IP
### **改IP核的网表文件的地址:在复制过来的vivado工程中找srcs/sources_1/ip/.../...sim_netlist.v文件
vlog -work work E:/modelsim_project/pll_t/PLL_t/PLL_t.srcs/sources_1/ip/clk_wiz_0/clk_wiz_0_sim_netlist.v
#SourceCode(设计文件)
#vlog -work work ../design/vlg_design.v
#Testbench(测试文件)
vlog -work work testbench_top.v
### 调用modelsim工具,在其中打开测试文件脚本
vsim -voptargs=+acc -L unisims_ver -L unisim -L work -Lf unisims_ver work.glbl work.testbench_top
#Add signal into wave window
### 添加波形,自动弹出波形界面
do wave.do
### 直接运行
#run -all
- testbench_top.v:代码如下:
`timescale 1ns/1ps
module testbench_top();
//参数定义
`define CLK_PERIORD 20 //时钟周期设置为20ns(50MHz)
//接口申明
reg clk;
reg rst_n;
wire clk_25m_out;
wire clk_50m;
wire clk_75m;
wire clk_75m_out;
wire clk_200m;
wire locked;
//对被测试的设计进行例化
clk_wiz_0 utt_clk_wiz_0 //模块命名
(
// Clock out ports
.clk_out1(clk_25m_out), // output clk_out1
.clk_out2(clk_50m), // output clk_out2
.clk_out3(clk_75m), // output clk_out3
.clk_out4(clk_75m_out), // output clk_out4
.clk_out5(clk_200m), // output clk_out5
// Status and control signals
.reset(~rst_n), // input reset
.locked(locked), // output locked
// Clock in ports
.clk_in1(clk)); // input clk_in1
//复位和时钟产生
//时钟和复位初始化、复位产生
initial begin
clk <= 0;
rst_n <= 0;
#1000;
rst_n <= 1;
end
//时钟产生
always #(`CLK_PERIORD/2) clk = ~clk;
//测试激励产生
initial begin
@(posedge rst_n); //等待复位完成
@(posedge clk);
repeat(300) begin
@(posedge clk);
end
$stop;
end
endmodule
运行run_simulation.bat文件。
完成