180 likes | 450 Views
FPGA 和 SOPC 应用 —— 熟悉 ModelSim. 华中科技大学启明学院电工电子科技创新中心 王贞炎. 内容. 使用 ModelSim 仿真 Verilog HDL 编写仿真平台( Testbench ) 编译和仿真 查看仿真结 果. ModelSim 介绍. 为什么要使用 ModelSim ? Quartus II 从 10.0 版本起不再提供对波形仿真的支持!! ModelSim 仿真更快、功能更强 在业界应用广泛. ModelSim 介绍. 为什么要仿真 复杂的设计几乎不可能写完功能就是对的,因此需要在投入使用前仿真验证
E N D
FPGA和SOPC应用——熟悉ModelSim 华中科技大学启明学院电工电子科技创新中心 王贞炎
内容 • 使用ModelSim仿真Verilog HDL • 编写仿真平台(Testbench) • 编译和仿真 • 查看仿真结果
ModelSim介绍 • 为什么要使用ModelSim? • Quartus II从10.0版本起不再提供对波形仿真的支持!! • ModelSim仿真更快、功能更强 • 在业界应用广泛
ModelSim介绍 • 为什么要仿真 • 复杂的设计几乎不可能写完功能就是对的,因此需要在投入使用前仿真验证 • 仿真分为功能仿真(一般即RTL级)和时序仿真(一般即Gate级) • 仿真的概念 • 通过产生一定的激励信号送给被测逻辑,并观察被被测逻辑的行为(包括输出和内部行为),来判断被测逻辑是否满足功能需求以及时序需求的过程。
使用ModelSim仿真 • 工程 • 采用ModelSim进行仿真,可以使用其仿真工程管理各种源代码文件、数据文件、设置文件等等;也可以不需要仿真工程,仅仅依赖源代码文件。 • Quartus调用ModelSim进行仿真的时候,属于后者,一般自行仿真,可采用前者。
使用ModelSim仿真 • ModelSim的界面 • 界面中的窗口都可以拖动停靠在主界面的左、右或者下方。
使用ModelSim仿真 • 建立工程 • 打开ModelSim • altera • /opt/altera/modelsim_ae/linuxaloem/vsim • 新建工程 • File - New - Project… 工程名 工程目录 可为新的工程建目录 或在待仿真的源文件处建立工程 这里新建一个目录
使用ModelSim仿真 • 为工程添加文件 • 将待仿真的文件复制进刚刚建立的目录内,并“Add Existing File”,将待仿真的文件添加进工程
使用ModelSim仿真 • 为工程添加文件 • 创建用于书写Testbench的源文件,“Create New File” 文件名 文件类型 放置在哪个目录
使用ModelSim仿真 • 为工程添加文件 • 创建仿真设定 testbench的顶层模块名
编写Testbench • 编写testbench • Testbench中可以使用全部的verilog语法,包括: • #(延时) • initial • 各种系统函数,$stop,$readmemh等等 • …… • 在ModelSim中做功能仿真时,需要注意: • 所有寄存器型变量(如reg、initial)的仿真初始值均为不确定值“X”,如果你的模块中含有不会在运行期间被赋予确定值的reg,那么在ModelSim中它会一直保持为“X”,这是与实际器件不符的,因为实际器件中不会出现“X”。 这些语法是不可综合进FPGA的
编写Testbench • 一个Testbench解析 `timescale 1ns/1ps module testbench; reg clk, arst; wire en; wire [15 : 0] gray; reg [3 : 0] cnt; initial begin gray_inst.cnt <= 1’b0; clk <= 1'b1; arst <= 1'b0; cnt <= 1'b0; #1234 arst <= 1'b1; #1234 arst <= 1'b0; end always begin #10 clk <= ~clk; end always@(posedge clk) begin if(cnt < 4'd9) begin cnt <= cnt + 1'b1; end else begin cnt <= 1'b0; end end assign en = (cnt == 4'd0); gray #(.W(16)) gray_inst( .clk(clk), .en(en), .arst(arst), .gray(gray)); endmodule 时间单位/时间精度 仿真的顶层模块 申明需要的寄存器和线网 Initial, 初始化 初始化gray_inst中的寄存器 在1234ns处产生一个宽度为1234ns的arst信号 产生周期为20ns的时钟 模为10的计数器cnt,用于驱动en信号每10个周期有效 调用被测试的模块
编译和仿真 • 编译 • 在project视图中右键单击,选择菜单 - Compile - Compile All • 如果编译有错误,会在脚本窗口中出现红色提示,双击它可以定位错误
编译和仿真 • 启动仿真 • 双击仿真设定文件“Simulation 1”,ModelSim启动仿真并切换到仿真界面布局
编译和仿真 • 添加待观察信号 • 在Instance窗口中选择模块,在Objects窗口中选择待观察对象拖拽到Wave窗口中。 右键菜单中可设置信号的显示格式(数字或模拟波形)和进制;拖动可排序 长短对象名切换 可添加新光标 光标
编译和仿真 • 设定仿真时间,并仿真 • 在仿真事件文本框里输入时间,并单击Run按钮 仿真复位(Restart) 设定仿真时间 仿真(Run) 被中断/断点后继续仿真(ContinueRun) 中断仿真(Break) 仿真直到源文件指定的结束条件(RunAll)
编译和仿真 • 调试 • 可在源文件中设定断点,仿真至断点时,会暂停 • 需要注意:HDL描述的逻辑是并发的,虽然ModelSim可以单步,但应理解为,它只是将并发发生的事件,展开分时展示给我们观察 调试运行 断点
查看结果 • 仿真开始之后,便可以看到Wave窗口中出现波形 • 如果发现错误需要修改源文件: • 修改 - 保存 - 编译此文件 - 仿真复位 - 重新仿真 波形视图缩放 可是窗口脱离主界面最大化 在波形窗口中,按住Ctrl,左键斜上拖拽鼠标,可缩小波形,斜下拖拽可放大