iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Verilog  8 种编译指令使用详解
  • 245
分享到

Verilog  8 种编译指令使用详解

Verilog 编译指令Verilog 编译 2023-05-15 08:05:01 245人浏览 泡泡鱼
摘要

目录Verilog 编译指令define, undef`include`timescale`default_Nettype`resetallcelldefine, endcellde

Verilog 编译指令

编译指令为 Verilog 代码的撰写、编译、调试等提供了极大的便利。

下面介绍下完整的 8 种编译指令,其中前 4 种使用频率较高。

define, undef

在编译阶段,`define 用于文本替换,类似于 C 语言中的 #define

一旦 `define 指令被编译,其在整个编译过程中都会有效。例如,在一个文件中定义:

`define    DATA_DW     32

则在另一个文件中也可以直接使用 DATA_DW。

`define    S     $stop;   
//用`S来代替系统函数$stop; (包括分号)
`define    Word_DEF   reg [31:0]       
//可以用`WORD_DEF来声明32bit寄存器变量

`undef 用来取消之前的宏定义,例如:

`define    DATA_DW     32
……
reg  [DATA_DW-1:0]    data_in   ;
……
`undef DATA_DW
`ifdef, `ifndef, `elsif, `else, `endif

这些属于条件编译指令。例如下面的例子中,如果定义了 MCU51,则使用第一种参数说明;如果没有定义 MCU、定义了 WINDOW,则使用第二种参数说明;如果 2 个都没有定义,则使用第三种参数说明。

`ifdef       MCU51
    parameter DATA_DW = 8   ;
`elsif       WINDOW
    parameter DATA_DW = 64  ;
`else
    parameter DATA_DW = 32  ;
`endif

elsif, else 编译指令对于 ifdef 指令是可选的,即可以只有 ifdef 和 `endif 组成一次条件编译指令块。

当然,也可用 `ifndef 来设置条件编译,表示如果没有相关的宏定义,则执行相关语句。

下面例子中,如果定义了 WINDOW,则使用第二种参数说明。如果没有定义 WINDOW,则使用第一种参数说明。

`ifndef     WINDOW
    parameter DATA_DW = 32 ;  
 `else
    parameter DATA_DW = 64 ;
 `endif

`include

使用 `include 可以在编译时将一个 Verilog 文件内嵌到另一个 Verilog 文件中,作用类似于 C 语言中的 #include 结构。该指令通常用于将全局或公用的头文件包含在设计文件里。

文件路径既可以使用相对路径,也可以使用绝对路径。

`include         "../../param.v"
`include         "header.v"

`timescale

在 Verilog 模型中,时延有具体的单位时间表述,并用 `timescale 编译指令将时间单位与实际时间相关联。

该指令用于定义时延、仿真的单位和精度,格式为:

time_unit 表示时间单位,time_precision 表示时间精度,它们均是由数字以及单位 s(秒),ms(毫秒),us(微妙),ns(纳秒),ps(皮秒)和 fs(飞秒)组成。时间精度可以和时间单位一样,但是时间精度大小不能超过时间单位大小,例如下面例子中,输出端 Z 会延迟 5.21ns 输出 A&B 的结果。

`timescale 1ns/100ps    //时间单位为1ns,精度为100ps,合法
//`timescale 100ps/1ns  //不合法
module AndFunc(Z, A, B);
    output Z;
    input A, B ;
    assign #5.207 Z = A & B
endmodule

在编译过程中,timescale 指令会影响后面所有模块中的时延值,直至遇到另一个 timescale 指令或 `resetall 指令。

由于在 Verilog 中没有默认的 timescale,如果没有指定 timescale,Verilog 模块就有会继承前面编译模块的 `timescale 参数。有可能导致设计出错。

如果一个设计中的多个模块都带有 `timescale 时,模拟器总是定位在所有模块的最小时延精度上,并且所有时延都相应地换算为最小时延精度,时延单位并不受影响。例如:

`timescale 10ns/1ns      
module test;
    reg        A, B ;
    wire       OUTZ ;
 
    initial begin
        A     = 1;
        B     = 0;
        # 1.28    B = 1;
        # 3.1     A = 0;
    end
 
    AndFunc        u_and(OUTZ, A, B) ;
endmodule

在模块 AndFunc 中,5.207 对应 5.21ns。

在模块 test 中,1.28 对应 13ns,3.1 对应 31ns。

但是,当仿真 test 时,由于 AndFunc 中的最小精度为 100ps,因此 test 中的时延精度将进行重新调整。13ns 将对应 130100ps,31ns 将对应 310100ps。仿真时,时延精度也会使用 100ps。仿真时间单位大小没有影响。

如果有并行子模块,子模块间的 `timescale 并不会相互影响。

例如在模块 test 中再例化一个子模块 OrFunc。仿真 test 时,OrFunc 中的 #5.207 延时依然对应 52ns。

//子模块:
`timescale 10ns/1ns      //时间单位为1ns,精度为100ps,合法
module OrFunc(Z, A, B);
    output Z;
    input A, B ;
    assign #5.207 Z = A | B
endmodule
 
//顶层模块:
`timescale 10ns/1ns      
module test;
    reg        A, B ;
    wire       OUTZ ;
    wire       OUTX ;
 
    initial begin
        A     = 1;
        B     = 0;
        # 1.28    B = 1;
        # 3.1     A = 0;
    end
 
    AndFunc        u_and(OUTZ, A, B) ;
    OrFunc         u_and(OUTX, A, B) ;
 
endmodule

此例中,仿真 test 时,OrFunc 中的 #5.207 延时依然对应 52ns。

`timescale 的时间精度设置是会影响仿真时间的。时间精度越小,仿真时占用内存越多,实际使用的仿真时间就越长。所以如果没有必要,应尽量将时间精度设置的大一些。

`default_nettype

该指令用于为隐式的线网变量指定为线网类型,即将没有被声明的连线定义为线网类型。

该实例定义的缺省的线网为线与类型。因此,如果在此指令后面的任何模块中的连线没有说明,那么该线网被假定为线与类型。

该实例定义后,将不再自动产生 wire 型变量。

例如下面第一种写法编译时不会报 Error,第二种写法编译将不会通过。

//Z1 无定义就使用,系统默认Z1为wire型变量,有 Warning 无 Error
module test_and(
        input      A,
        input      B,
        output     Z);
    assign Z1 = A & B ;  
endmodule
//Z1无定义就使用,由于编译指令的存在,系统会报Error,从而检查出书写错误
`default_nettype none
module test_and(
        input      A,
        input      B,
        output     Z);
    assign Z1 = A & B ;  
endmodule

`resetall

该编译器指令将所有的编译指令重新设置为缺省值。

`resetall 可以使得缺省连线类型为线网类型。

当 resetall 加到模块最后时,可以将当前的 timescale 取消防止进一步传递,只保证当前的 timescale 在局部有效,避免 timescale 的错误继承。

celldefine, endcelldefine

这两个程序指令用于将模块标记为单元模块,他们包含模块的定义。例如一些与、或、非门,一些 PLL 单元,PAD 模型,以及一些 Analog IP 等。

`celldefine
module (
    input      clk,
    input      rst,
    output     clk_pll,
    output     flag);
        ……
endmodule
`endcelldefine

unconnected_drive, nounconnected_drive

在模块实例化中,出现在这两个编译指令间的任何未连接的输入端口,为正偏电路状态或者为反偏电路状态。

`unconnected_drive pull1
. . .
 / *在这两个程序指令间的所有未连接的输入端口为正偏电路状态(连接到高电平) * /
`nounconnected_drive
`unconnected_drive pull0
. . .
 / *在这两个程序指令间的所有未连接的输入端口为反偏电路状态(连接到低电平) * /
`nounconnected_drive 

以上就是Verilog 8 种编译指令使用详解的详细内容,更多关于Verilog 编译指令的资料请关注编程网其它相关文章!

--结束END--

本文标题: Verilog  8 种编译指令使用详解

本文链接: https://www.lsjlt.com/news/208692.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Verilog  8 种编译指令使用详解
    目录Verilog 编译指令define, undef`include`timescale`default_nettype`resetallcelldefine, endcellde...
    99+
    2023-05-15
    Verilog 编译指令 Verilog 编译
  • Verilog编译指令怎么使用
    这篇“Verilog编译指令怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Verilog编译指令怎么使用”文章吧。V...
    99+
    2023-07-06
  • mp-vue编译指令如何使用
    本文小编为大家详细介绍“mp-vue编译指令如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“mp-vue编译指令如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。首先我们来看一下不同文件的生成&quo...
    99+
    2023-07-04
  • 使用cache加快编译速度的命令详解
    目录Ubuntu 安装ccache使用libzmq测试ccacheUbuntu 安装ccache sudo apt-get install ccache安装完后确认安装执行which...
    99+
    2024-04-02
  • 详解汇编语言各种指令的解释与用法
    汇编语言是一种低级语言,与计算机硬件直接相关。它使用一系列的指令来表示计算机的操作。下面是一些常见的汇编指令及其解释与用法:1. M...
    99+
    2023-08-17
    汇编语言
  • Golang交叉编译之跨平台编译使用详解
    目录在CMD命令行中编译设置Linux编译环境powershell命令行中一、CGO_ENABLED二、GOOS三、GOARCH四、GOHOSTOS五、GOHOSTARCH六、go ...
    99+
    2024-04-02
  • 详解ngx_cache_purge_proxy_cache指令使用
    目录1. proxy_cache 指令2. proxy_cache_bypass指令3. proxy_cache_key指令4. proxy_cache_lock指令5. proxy...
    99+
    2024-04-02
  • java反编译指令有什么用
    Java反编译指令是用来将已经编译过的Java字节码文件(.class文件)转换回Java源代码文件(.java文件)。这个过程称为...
    99+
    2023-10-26
    java
  • PHP 8 在Centos7下的编译安装与使用
    PHP 8 在Centos7下的编译安装与使用 前言 PHP官方已经停止维护php7,更新一下PHP8手动安装的教程 ...
    99+
    2023-09-03
    php 开发语言
  • C++的using声明和using编译指令怎么使用
    这篇文章主要介绍“C++的using声明和using编译指令怎么使用”,在日常操作中,相信很多人在C++的using声明和using编译指令怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++的usi...
    99+
    2023-06-22
  • Java SpringBoot启动指定profile的8种方式详解
    目录配置文件中设置命令行设置IDEA中设置1、program arguments程序参数2、VM options虚拟机参数3、Active profiles 参数遇到的问题总结配置文...
    99+
    2024-04-02
  • 汇编语言LDR指令和LDR伪指令详解
    目录LDR指令和LDR伪指令详解ARM32位指令的构成ldr指令和ldr伪指令的使用区别:补充1:补充2:汇编语言ldr伪指令LDR指令和LDR伪指令详解 ARM32位指令的构成 A...
    99+
    2023-01-28
    ldr指令和ldr伪指令 汇编语言ldr伪指令 汇编语言ldr指令
  • 详解汇编语言MOV指令
    MOV(Move)指令是汇编语言中最基本的指令之一,用于将数据从一个位置复制到另一个位置。它的语法形式通常是:MOV dest, s...
    99+
    2023-08-14
    汇编语言
  • C++中protobuf 的交叉编译使用详解
    目录前言简介使用方式编译安装使用步骤常见问题解决方案前言 为了提高通信效率,可以采用 protobuf 替代 XML 和 Json 数据交互格式,protobuf 相对来说数据量小,...
    99+
    2024-04-02
  • 详解JDK自带javap命令反编译class文件和Jad反编译class文件(推荐使用jad)
    目录一、前言二、编写java文件三、科补代码理解四、javap命令五、执行javap命令六、下载Jad包1. 网址下载2. 解压到指定目录3. 配置环境变量4. 常用命令查看5.实践...
    99+
    2024-04-02
  • C++编译器Clion的使用详解(总结)
    推荐教程 Clion2020.2.x最新激活版附安装教程(Mac Linux Windows) 最新clion2020激活附安装教程(亲测有效) Clion是由JetBrains公司...
    99+
    2024-04-02
  • java反编译class命令如何使用
    要使用Java反编译class命令,你需要安装并配置Java的反编译工具,比如JD-GUI或Jad。然后,可以按照以下步骤使用反编译...
    99+
    2023-10-20
    java
  • 详解Vue自定义指令及使用
    目录一、什么是指令vue 中常用的一些内置 v- 指令v-if 和 v-show 的对比二、自定义指令的钩子函数三、全局指令四、局部指令五、带参数的自定义指令六、函数简写七、应用实例...
    99+
    2024-04-02
  • nginx 配置指令之location使用详解
    目录前言配置策略具体属性介绍Nginx是支持世界上所有网站三分之一的Web服务器。因为轻巧,模块化,用户友好的配置格式以强大的反向代理能力,Nginx迅速取代其他Web服务器成了互联...
    99+
    2024-04-02
  • .Net部署Docker-v指令使用详解
    目录记录Docker的-v指令使用前言问题出现问题解决扩展记录Docker的-v指令使用 前言 之前我浅学了一下docker,方便部署.net项目(部署的是打包之后的项目) dock...
    99+
    2023-05-17
    docker -v指令使用 .net部署docker-v指令使用
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作