Verilog 基础仿真文件编写

这篇具有很好参考价值的文章主要介绍了Verilog 基础仿真文件编写。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Verilog 基础仿真文件编写

前言

在学习Verilog的过程中,相信大家都陷入了一个怪圈,那就是对于写模块相当拿手,但是一到编写仿真激励的时候就开始“抓瞎”,不知从何写起,本人也是一样。发现问题就要积极解决问题,因此,总结一篇博客(今后会不断更新)来介绍常用的一些基础仿真语句,供自己总结,也供大家查用。

编译指令

编译指令起源于C语言当中的预处理指令,一般写在文件开头,编译器首先处理这些指令,配置仿真的一些相关参数, 他们都是以 反引号 ` 开头

`timescale 指令

`timescale 1ns/100ps //句法为 `timescale 延时单位/最小时间粒度;

仿真文件往往都是以`timescale开头的,这个指令的作用是设置仿真文件当中的 延时单位 与最小的分辨率,并且采用四舍五入的规则。

例如 #1.116,对于1ns/100ps来说,最小进度为0.1ns,因此相当于延时1.1ns,但是如果对于1ns/10ps,就相当于1.12ns(四舍五入)

`define 宏定义指令

`define BUS_WIDTH 16 //即定义一个总线宽度为16,句法为 `define ABC空格abc 
reg [`BUS_WIDTH-1:0] Data ; //调用时需要使用 反引号` 开头 

第一注意点,`define 和 parameter的最大不同在于,`define是全局的,可以跨文件使用;而parameter定义的参数只能在当前文件使用。

第二个注意点是,`define指令在被编译后,将在整个编译过程中有效,直到遇到`undef指令为止。

`undef BUS_WIDTH //此后的任何 `BUS_WIDTH都将失效

`ifdef 条件编译指令

`ifdef A
    语句1;
`else
    语句2;
`endif
//作用就是如果先前定义了A宏,那么执行语句1,否则执行语句2,并且`else语句是可选的

`include 语句

`include "HEADFILE.h" //这样在编译的时候,这行语句将被HEADFILE文件中的内容完全替换

具体使用的例子之后补充,重点在于路径的寻址。

`resetall 语句

该语句的作用在于将其它编译指令重新设置为缺省值

仿真过程语句

在仿真过程中,需要产生激励波形,或者初始化变量值,最常使用的便是 always和initial。在仿真文件中,我们的重点在于产生激励,所以句法相对自由,不必过分担心综合的问题。

always语句

always语句的特性为重复执行,而重复执行需要一些条件,例如 信号电平跳变,延时触发等等。

用法1:always 定时执行语句

always #10 begin
clock = ~clok;
end
//上段代码的功能为每隔10个单位时间,clock就取反一次,这样也就间接产生了时钟信号;
//句法为:
always #xx begin
语句;
end //每隔xx时间,语句执行一次

用法2: always产生任意占空比时钟

always begin
#Hi_time  clock = 0; //低电平占Hi_time个时间单位
#Lo_time  clock = 1; //高电平占Lo_time个时间单位
end

用法3: always + assign 产生相移时钟

所谓相移,就是相对与一个原始时钟延时了一段时间,因此这种关系的表征,我们可以选用assign语。

always #10 clock = ~clock;
//always产生时钟,可以是固定占空比,也可以是任意占空比
assign #PHASE_SHIFT Derived_clock = clock;
//assign #延时 相移时钟 = 源时钟;
//值得注意的是,相移时钟为wire类型,而源时钟为reg型,这是语法决定的。

用法4:always条件执行语句

//该用法在可综合中较为常见,不过多介绍
always@(posedge clock)begin
语句;
end
//clock上升沿的时候执行语句

initial语句

initial语句一般只执行一次,一般initial用来作初始化的操作,如果需要执行多次的话,则需要嵌入循环语句,例如 while、repeat、for、forever等。

用法1:initial对变量进行初始化

initial begin
    a=1;
    b=0;
    sel=0;
    #10
    sel=1;
    #10
    sel=0;
    #10
    $stop;
end
//基本句法就是 initial begin ... end 

重点在于对于赋值时刻的理解:

Verilog 基础仿真文件编写

在这里我们使用的是阻塞赋值,但是在仿真波形上看,只要两句话之间没有延时,那么他们几乎就是同时进行的。

用法2:initial 产生时钟信号

initial 的特点就是只执行一次,因此需要嵌入 forever语句产生循环的效果

initial begin
    forever
        #Clock_Period/2 clock = ~clock;
end

类似的还可以嵌入 repeat语句来产生有限次数的时钟信号:

initial begin
    clock = 0;
    repeat(PulseCount)
        #Clock_Period/2 clock = ~clock;
end

用法3:initial产生异步复位信号

复位信号不是周期信号,因此可以使用initial语句进行生成。所谓异步复位就是说复位信号与时钟信号无关,也就是说想什么时候复位就什么时候复位。

以下代码是一个低电平复位的实例,10ns时开始复位,并且持续50ns的时间。

parameter PERIOD = 10;
reg Rst_n;
initial begin
Rst_n = 1;
#PERIOD Rst_n = 0;
#(5*PERIOD) Rst_n = 1;
end

用法4:initial 产生同步复位信号

所谓同步复位就是复位的动作发生在时钟信号的跳变沿,因此需要与时钟同步。下面的例子描述了一个同步的例子。核心的知识点在于 @(posedge Clock); 这个语句;我们可以理解为:如果没有检测到posedge clock,那么这个语句就会一直卡在这里。

initial begin
    Rst_n = 1;
    @(posedge Clock); //时钟上升沿
    Rst_n = 0;
    #30; //可以替换为 repeat(3) @(negedge Clock); 即等待3个时钟下降沿
    @( negedge Clock);//时钟下降沿
    Rst_n = 1;
end
Verilog 基础仿真文件编写

系统任务函数

系统任务函数一般以美刀符号$开头,用来控制仿真器的运行,是我们编写仿真文件中重要的一块内容。

$random(seed)

这个函数的作用就是返回一个随机的32bit的integer类型的数。使用的重点在一下两个方面:

  1. 控制产生的随机数的范围

num = {$random}%b; //正数常用
//产生的随机数字的范围i控制在0到b-1之间
num2 = $random%b; //正负都有
//产生的随机数字的范围在 -b+1到b-1之间
  1. 关于seed参数的作用

$random()产生的随机数其实并不随机,其实也是一个固定的序列,只不过这些个序列很大,足够类似于随机数。因此,seed参数的作用相当于选择不同的随机序列,因此如果需要两个随机序列不同,那么可以选择不同的seed参数。

$dispaly()系统函数

该函数的作用是在控制台输出仿真过程当值的一些信息。

$dispaly(“Hello World”); //控制台输出Hello World这个字符串
$dispaly(“A = %d,B =%h”,变量1,变量2); //在输出的结果当中嵌入变量的值,%d为整数,%h为16进制
$dispaly(“now time = %t”,$time); //控制台输出使用 $time代替%t,输出当前时间。

$time函数

返回当前仿真时间。

$readmemh函数

该系统函数一般用来初始化存储器变量,即从指定文件中读取数据到寄存器数组或者RAM或ROM中。

$readmemh("数据文件地址",预写入存储器名);
$readmemh("数据文件地址",预写入存储器名,写入起始地址,写入结束地址);

这个函数的使用注意点有两个:

第一,数据文件地址有两类,第一类叫绝对地址,就是从盘符开始一直到文件名,例如:

D:\digital\sim\data.txt

一般适用于数据文件在仿真文件夹之外的其它的地方

另外一类叫相对地址,就是从仿真文件所在文件夹开始索引,适用于数据文件和仿真文件在同一文件夹下或者在其子文件夹中。

第二个注意点是数据文件的格式。除了要求后缀为“.txt”外,数据文件中的数据必须为16进制,这也就是readmemh的原因,h代表了hex。并且数据之间的间隔必须为换行或者空格。

Verilog 基础仿真文件编写

或者

Verilog 基础仿真文件编写

二者选其一。

$readmemb函数

该函数使用方法与readmemh一致,只不过读取的数据为二进制,因此使用方法略过。

更新日志

2023/3/13 添加$readmemh函数的内容。.文章来源地址https://www.toymoban.com/news/detail-435658.html

到了这里,关于Verilog 基础仿真文件编写的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA学习笔记:verilog基础代码与modelsim仿真(六)——vga显示模块

    VGA显示 目标:实现屏幕红、橙、黄、绿、青、蓝、紫、黑、白、灰条形显示 1. 模块框图与波形图 vga_colorbar是实现目标功能的总体模块框图,为了实现对应的输出,我们使用三个具体功能模块实现功能。 (1) clk_gen——使用pll锁相环实现时钟分频 (2)vga_ctrl——图像控制与输出模

    2024年02月04日
    浏览(33)
  • FPGA学习笔记(五)Testbench(测试平台)文件编写进行Modelsim仿真

    一、FPGA学习笔记(一)入门背景、软件及时钟约束 二、FPGA学习笔记(二)Verilog语法初步学习(语法篇1) 三、FPGA学习笔记(三) 流水灯入门FPGA设计流程 四、FPGA学习笔记(四)通过数码管学习顶层模块和例化的编写 五、FPGA学习笔记(五)Testbench(测试平台)文件编写进行

    2024年02月07日
    浏览(39)
  • 用Verilog编写1位全加器,并进行波形仿真

    Quartus II+ModelSiml 全加器英语名称为full-adder,是用门电路实现两个二进制数相加并求出和的组合线路,称为一位全加器。一位全加器可以处理低位进位,并输出本位加法进位。

    2024年02月11日
    浏览(32)
  • 使用Verilator仿真基于Verilog编写的testbench并用GTKWave查看波形

    Verilator是一个开源的Verilog、SystemVerilog仿真EDA。 它进行仿真的第一步称为“verilate”,将编写好的.v/.sv文件转化成为C++编写的类和方法。 第二步则是建立C++运行环境wrapper file,在里面编写的main函数用于例化第一步里生成的和Verilator自带的仿真不可缺少的类,之后运行Verilato

    2024年02月09日
    浏览(35)
  • 【0基础学会Verilog】003. 为Verilog模块编写测试模块testbench

    完成了C语言函数( function )或Verilog功能模块( module )的编写,接下来我们需要对其进行测试、仿真等手段来验证函数或模块的正确性。本篇博文介绍为一个给定的Verilog模块编写仿真模块,也就是所谓 testbench 的方法。 我们为上一篇博文【0基础学会Verilog】002. Verilog时序逻辑实现

    2024年04月17日
    浏览(21)
  • FPGA实现的多波形信号发生器,支持正弦、方波、锯齿波、三角波及调制,配备仿真和实物制作功能,使用Verilog HDL编写

    基于FPGA的DDS多波形信号发生器,可以产生正弦波,方波,锯齿波三角波,调制波形2psk.2askAM调制,可以仿真,可以制作实物,可以进行讲解! 使用可以使用Quarter9.0自带仿真软件进行仿真波形。 也可以使用quarter13.1与modesim进行联合仿真进行仿真波形! 使用verilog HDL语言进行编

    2024年04月12日
    浏览(39)
  • 「Verilog学习笔记」根据RTL图编写Verilog程序

    专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 观察题目给出的RTL图,主要的器件是两个D触发器,一个与门。D触发器含有异步复位信号,且为低电平有效。data_in输入到D触发器,D触发器的输出Q是前一时刻的data_in,即data_in打一

    2024年03月24日
    浏览(31)
  • FPGA | Verilog仿真VHDL文件

    VHDL模块代码 Verilog仿真代码

    2024年02月10日
    浏览(29)
  • Verilog Tutorial(6)如何编写一个基础的Testbench

    在自己准备写verilog教程之前,参考了许多资料----FPGA Tutorial网站的这套verilog教程即是其一。这套教程写得不错,只是没有中文,在下只好斗胆翻译过来(加了自己的理解)分享给大家。 这是网站原文:https://fpgatutorial.com/verilog/ 这是系列导航:Verilog教程系列文章导航 本文将

    2023年04月10日
    浏览(25)
  • 【0基础学会Verilog】004. 学会使用Vivado自带仿真器

    编写好实现指定功能的Verilog模块后,需要对其进行仿真来验证 模块 的正确性,这需要用到EDA开发工具的仿真器,我们选择Xilinx公司的Vivado自带的仿真工具进行仿真。 在前面的章节已经学习了为Verilog模块编写基本的测试模块,即testbench的基本步骤和方法。本文不再赘述,直

    2024年02月04日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包