Verilog
文章平均质量分 57
主要介绍Verilog语言的各种用法,语法等内容。
Alfred.HOO
专注于IP和SOC验证
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Linux中verilog-mode使用方法总结
Verilog语言有几个设计缺陷,迫使用户输入和维护冗余信息,例如参数列表、灵敏度列表和跨模块连接语句。支持这些信息会导致潜在的错误,缺乏可维护性,以及整体的代码膨胀。原创 2022-06-18 19:45:16 · 6906 阅读 · 0 评论 -
Verilog中奇偶校验位的计算方法
偶校验: 数据和校验位中1的总数为偶数,则认为数据无误,否则标识数据有误;奇校验: 数据和校验位中1的总数为奇数,则认为数据无误,否则标识数据有误;原创 2022-06-18 16:52:21 · 1635 阅读 · 0 评论 -
Verilog中$display和$write任务以及格式化输出
($display)自动地在输出后进行换行。($write)则在输出后不换行。如果想在一行里输出多个信息,可以使用($write)。原创 2022-06-18 16:51:26 · 7888 阅读 · 0 评论 -
【IEEE_Verilog-4.8】整数、实数、时间和实数时间
除了建模硬件之外,变量在HDL模型中还有其他用途。虽然reg变量可以用于一般目的,例如计算特定net变化值的次数,但提供integer和time变量数据类型是为了方便和使描述更文档化。原创 2022-06-18 16:49:28 · 1332 阅读 · 0 评论 -
verilog-mode的简要介绍
Verilog-mode.el is the extremely popular free Verilog mode for Emacs which provides context-sensitive highlighting, auto indenting, and provides macro expansion capabilities to greatly reduce Verilog coding time. It supports AUTOs and indentation in Emacs原创 2022-06-11 20:35:42 · 2795 阅读 · 1 评论 -
Verilog中二等号==和三等号===的用法总结
在Verilog HDL语言中,存在着4中等式运算符:== 等于!= 不等于=== 等于!= 不等于注意:求反号,双等号,三等号之间不能有空格。这四个运算符都是双目运算符,它要求有两个操作数。==和!=又称为逻辑等式运算符,其结果有两个操作数的值决定。由于操作数中某些为可能是不定值x和高阻值z。而===和!==运算符则不同,它在对操作数进行比较时,对某些位的不定值x和高阻值z也进行比较,两个操作数必须完全一致,其结果才是1,否则为0。===和!==运算符常用于case表达式判别,所以又原创 2022-05-17 08:38:13 · 12359 阅读 · 0 评论 -
Verilog中的生成块的使用方法总结
生成语句可以动态地生成Verilog代码。这一声明语句方便了参数化模块的生成。当对矢量中的多个位进行重复操作时,或者当进行多个模块的实例引用的重复操作时,或者在根据参数的定义来确定程序中是否应该包括某段Verilog代码的时候,使用生成语句能够大大简化程序的编写过程。 生成语句能够控制变量的声明、任务或函数的调用,还能对实例引用进行全面的控制。编写代码时必须在模块中说明生成的实例范围,关键字 generate-endgenerate 用来指定该范围。 生成实例可以是以下的一个或多种类型∶(1)模块;(2原创 2022-05-01 10:56:05 · 1824 阅读 · 1 评论 -
Verilog中关于使用任务task和函数function的小结
任务和函数可概括为以下特点:1.任务和函数都是用来对设计中多处使用的公共代码进行定义;使用任务和函数可以将模块分割成许多个可独立管理的子单元,增强了模块的可读性和可维护性;它们和C语言中的子程序其相同的作用。2.任务可以具有多个输入、输入/输出(inout)、输出变量;在任务中可以使用延迟事件和时序控制结构,在任务中可以调用其他任务和函数。3.可重入任务使用关键字automatic进行定义,它的每一次调用都对不同的地址空间进行操作。因此在被多次并发调用时,它仍然可以获得正确的结果。4.函数只有有一个原创 2022-04-29 15:31:47 · 955 阅读 · 0 评论 -
【IEEE_Verilog-17.10】命令行输入
17.10 Command line input读取文件以获取用于仿真的信息的另一种方法是使用调用模拟器的命令指定信息。该信息以可选参数的形式提供给仿真器。这些参数在视觉上与其他模拟器参数不同,因为它们以加号(+)字符开头。这些参数,下面称为plusargs,可以通过在17.10.1和17.10.2描述的系统函数访问。17.10.1 \$test$plusargs (string)\$test$plusargs系统函数在plusargs列表中搜索用户指定的plusarg_string。该字符串在系统原创 2022-03-27 14:21:02 · 714 阅读 · 0 评论 -
【IEEE_Verilog-17.11】Verilog中的数学函数
17.11 Math functions有整数和实数的数学函数。数学系统函数可以在常量表达式中使用,如第5条所述。17.11.1 Integer math functions例如:integer result;result = $clog2(n);系统函数$clog2将返回参数以2为底的对数的上限(log向上圆整为一个整数值)。参数可以是整数或任意大小的向量值。参数将被视为无符号值,参数值为0的结果将为0。这个系统函数可以用来计算为给定大小的内存寻址所需的最小地址宽度或给定数量的状态所需的最原创 2022-03-27 09:59:55 · 1414 阅读 · 0 评论 -
【IEEE_Verilog-14.1】指定块的声明
14. Specify blocks两种类型的HDL构造通常被用来描述结构模型(如ASIC细胞)的延迟。具体如下:—分布式延迟,指定事件通过模块内部的门和网传播所花费的时间(参见7.14)—模块路径延迟,描述一个事件在源(输入端口或inout端口)传播到目标(输出端口或inout端口)所花费的时间。该子句描述了如何在模块中指定路径,以及如何将延迟分配给这些路径。14.1 Specify block declaration一个称为指定块的块语句是用来描述源和目标之间的路径以及为这些路径分配延迟的工原创 2022-03-26 21:29:50 · 589 阅读 · 0 评论 -
【IEEE_Verilog-12.2】覆写模块参数的值
12.2 Overriding module parameter values覆写模块参数值定义参数有两种不同的方法。第一个是module_parameter_port_list(见12.1),第二个是作为module_item(见4.10)。模块声明可以包含其中一种或两种类型的参数定义,也可以不包含参数定义。模块参数可以有类型规范和范围规范。参数覆盖对参数类型和范围的影响应遵循以下规则:—没有类型或范围说明的参数声明应默认为分配给参数的最终覆盖值的类型和范围。—具有范围规范但没有类型规范的参数应原创 2022-03-26 21:02:37 · 843 阅读 · 0 评论 -
Verilog中defparam的用法
在一个模块中改变另一个模块的参数时,需要使用defparm命令。例如,在做布线后仿真时,就是利用这种方法把布线延迟通过布线工具生成的延迟参数文件反标注到门级Verilog网表上。例如:`include "Top.v"`include "Black.v"`include "Annotate.v"module Test; wire W; Top T();endmodulemodule Top; wire W; Block B1(); Block B2();endmodul原创 2022-03-26 16:55:02 · 2844 阅读 · 0 评论 -
【Verilog-19.3】define和undef的用法
19.3 `define and `undef提供了文本宏替换功能,可以使用有意义的名称来表示常用的文本片段。例如,在整个描述中重复使用一个常数的情况下,文本宏是有用的,如果常数的值需要改变,因为它只需要更改源描述中的一个位置。文本宏工具不受编译器指令`resetall的影响。19.3.1 `define指令define为文本替换创建了一个宏。这个指令可以在模块定义的内部和外部使用。一个文本宏定义以后,通过使用(`)字符,后面跟着宏的名字,它可以在源代码描述中使用。编译器应该用宏的文本替换字符串`t原创 2022-02-19 19:41:21 · 8683 阅读 · 0 评论 -
【Verilog-9.9】initial和always的用法
9.9 Structured procedures结构化语句Verilog HDL中的所有过程语句都在以下四种语句之一中指定:—initial结构—always结构—task—functioninitial和always结构在仿真开始时启用。initial结构只执行一次,当语句执行完成后,活动就停止了。相比之下,always结构重复执行。只有当仿真停止时,它的活动才停止。在initial结构和always结构之间不应有隐含的顺序。initial结构不应在always结构之前调度和执行。在一个模原创 2022-02-19 12:10:33 · 3212 阅读 · 0 评论 -
【IEEE_Verilog-4.6.4】tri0和tri1的用法总结
4.6.4 Tri0 and tri1 netstri0和tri1 net模型分别具有下拉电阻和上拉电阻作用于它们。tri0 net等同于具有pull强度连续0值驱动它的wire net。tri1 net等同于具有pull强度连续1值驱动它的wire net。当没有驱动器驱动tri0 net时,它的值是具有pull强度的0。当没有驱动器驱动tri1 net时,它的值是具有pull强度的1。当有驱动作用于tri0和tri1 net时,驱动器与隐含驱动net上的具有pull强度的值去决定net的最终值。逻辑原创 2022-02-17 20:39:14 · 4625 阅读 · 0 评论 -
【IEEE_Verilog-12.4】generate的用法
12.4 Generate constructgenerate构造用于在模型中有条件地或实例化的生成块。生成块是一个或多个模块项的集合。一个生成块不能包含端口声明、参数声明、指定块或specparam声明。所有其他模块项,包括其他的generate结构,都允许在一个generate块中。generate结构为参数值提供了影响模型结构的能力。它们还允许描述具有重复结构的模块,使递归模块实例化成为可能。有两种类型的循环结构:loops和conditionals。loop生成结构允许在一个模型中实例化一个生成原创 2022-01-23 20:32:33 · 2872 阅读 · 0 评论 -
【Verilog-26】Net线路连接
Net是结构描述中为线路连接(连线和接线)建立的模型。net的值是由net的驱动所决定的。驱动器可以是门、UDP、实例模块或者连续赋值语句的输出。语法:1.supply0和supply1类型的net变量分别具有逻辑值0和1,并可以为它定义驱动能力(supply strength);2.tri0和tri1类型的nets,当没有驱动时,分别具有逻辑值0和1,并可以为它定义驱动能力;3.如果net变量的扩展选项选用了关键词vectored,则不允许对它进行某位和某些位的选择,也不允许对它定义强度,PLI原创 2022-01-14 23:10:33 · 1272 阅读 · 0 评论 -
【Verilog-18】Gate门
Verilog已有一些建立好的逻辑门和开关的模型。在所设计的模块中,可通过实例引用这些门与开关模型,从而对模块进行结构化的描述。逻辑门:and (Output, Input, …) //与门nand (Output, Input, …) //与非门or (Output, Input, …) //或门nor (Output, Input, …) //或非门xor (Output, Input, …) //异或xnor (Output, Input, …) //同或缓冲器与非门:buf (Ou原创 2022-01-14 23:10:53 · 4128 阅读 · 0 评论 -
【Verilog-41】Verilog中强度strength的用法
除了逻辑值外,net类型的变量还可以定义强度,因而可以更精确的建模。net的强度来自于动态net驱动器的强度。在开关级仿真时,当net由多个驱动器驱动且其值互相矛盾时,可常用强度的概念来描述这种逻辑行为。(strength0, strength1)(strength1, strength0)(strength0)------------pulldown primitives only(strength1)------------pullup primitives only(chargestreng原创 2022-01-13 22:15:19 · 12127 阅读 · 0 评论 -
【Verilog-42】Verilog中字符串String的用法
字符串能够用在系统任务(诸如$display和$monitor等)中作为变量,字符串的值可以像数字一样储存在寄存器中,也可以像对数字一样对字符串进行赋值,比较和拼接。用法:1.一条字符串不能占源代码的多行;2.字符串可以包含下列列表中的扩展字符;3.诸如$display和$monitor等系统任务中的打印字符串可以包含特殊的格式控制字符串,如%b。4.当字符串存储于寄存器中,每个字符要占8位,字符以ASCII代码形式存储。Verilog HDL语言的字符串的定义和C语言不一样。在C语言中需要用而原创 2022-01-12 22:34:53 · 5098 阅读 · 0 评论 -
Verilog中pullup(scl)和assign (weak0, weak1) scl = 1‘b1的区别
在Verilog中经常会遇到pullup、pulldown和assign (strength0, strength1),那么它们究竟有什么区别?它们之间的区别主要是语法和驱动强度。pullup、pulldown看做是门级原语,assign语句看做是RTL。SystemVerilog接口不允许门级原语。如果是用来写ip,应该使用assign语句。一些工具,像静态时序分析,期望用门级原语建模,而不是RTL,这时应该使用pullup、pulldown来代替。pullup、pulldown默认的驱动强度是原创 2022-01-12 22:33:56 · 8607 阅读 · 2 评论 -
【IEEE_Verilog-7.9】Verilog中的逻辑强度建模Logic strength modeling
7.8 pullup and pulldown sources上拉或下拉源的实例化声明应该以以下关键词之一开始:pullup pulldown一个上拉源应该对连接到它的终端列表中的net赋值1,下拉源应该对连接到它的终端列表中的net赋值0。在缺少强度的情况下,对net放置的这些源信号应该有pull强度。如果对一个上拉源有strength1的强度或对一个下拉源有strength0的强度,这个信号应该有指定的强度。对一个上拉源的strength0的强度或对一个下拉源的strength1的强度应该被忽略原创 2022-01-04 21:40:40 · 2541 阅读 · 0 评论 -
【IEEE_Verilog-4.6/7】Verilog中的线网net类型
本文来自IEEE Standard for Verilog Hardware Description Language中4.6 Net types4.6 net类型有几种不同类型net,如表4-1所示:Table 4-1—Net typeswiretritri0supply0wandtriandtri1supply1wortriortrireguwire4.6.1 Wire and tri netsWire 和tri 连接元件。Net类型的wire和原创 2022-01-03 20:22:51 · 5374 阅读 · 2 评论 -
【IEEE_Verilog-4.4】Verilog中的充电强度charge strength和驱动强度drive strength
本文来自IEEE Standard for Verilog Hardware Description Language中4.4 strength1 强度strength在net声明中指定的两种类型强度如下:—当声明trireg类型的线网时应该使用充电强度charge strength—当在相同的声明net语句中对一个net进行连续赋值时应该使用驱动强度drive strengthGate声明还可以指定驱动强度。关于gate和强度的更多信息请参阅第7条。1.1 充电强度charge strengt原创 2022-01-03 20:21:04 · 2149 阅读 · 0 评论 -
verilog中pullup和pulldown的用法
pullup、pulldown的用法:pullup或pulldown只对对当前无驱动的线wire才会有作用,若有驱动应该按照驱动信号来决定!当线wire为z时,pullup或pulldonw才起作用!也就是‘Z’可以变成‘1’或‘0’,而不是‘0’能变‘1’(‘1’变‘0’),否则就跟你设计想法不一样了。以下的例子进一步说明了这个问题:`timescale 1ns/1psmodule test();reg a;reg d;wire b;wire c;wire e;reg clk;原创 2021-12-22 22:42:06 · 15562 阅读 · 2 评论 -
verilog中的任务task和函数function用法及区别
verilog中的task和function不同点如下:1)函数只能与主模块共同用同一个仿真时间单位,而任务可以定义自己的仿真时间单位;2)函数不能启动任务,而任务能启动其他函数和任务;3)函数至少要有一个输入变量,而任务可以没有或有多个任何类型的输入变量;4)函数返回一个值,而任务则不返回值;函数的目的是通过返回一个值来响应输入信号的值,verilog中使用函数时,把它当作表达式中的操作符,这个操作的结果的值就是函数的返回值;任务能支持多种目的,能计算多个结果值,这些结果值只能通过被调用的任务原创 2021-10-18 14:52:44 · 6118 阅读 · 0 评论 -
verilog中的连续赋值、过程赋值和过程性连续赋值
1. 连续赋值语句(Continuous Assignments)连续赋值的主要特点:1)语法上,有关键词“assign”来标识;2)连续赋值语句不能出现在过程块中(initial/always);3)连续赋值语句主要用来对组合逻辑进行建模以及线网数据间进行描述;4)左侧被赋值的数据类型必须是线网型数据(wire)连续赋值语句的左值可以是一下类型之一:①标量线网②向量线网③矩阵中的一个元素(该矩阵可以是标量线网类型的,也可以是向量线网类型的)④向量线网的某一位⑤向量线网的部分位以及上原创 2021-10-18 14:51:57 · 15040 阅读 · 1 评论 -
verilog中事件event的用法
event变量声明为:event var;event触发为:->var;捕获触发为:@(var);10个时间单位后reset_trigger事件被触发,捕获后将reset设置一个时钟周期再触发reset_done_trigger。之后再分别设置10个周期的随机信号给enable和reset。`timescale 1ns/100psmodule event_test;event reset_trigger;event reset_done_trigger;reg clk;reg re原创 2021-10-17 12:46:43 · 8886 阅读 · 0 评论 -
verilog中always和initial的区别
initial不可综合,always可以综合Initial是为测试而生,只能用于测试,只执行一次;module/endmodule, interface/endinterface硬件世界program/endprogram, class/endclass软件世界always过程块是用来描述硬件时序和组合电路,因此可以在module和interface中使用;不可以在always中初始化变量,initial只执行一次;initial和always一样,无法延迟执行,仿真一开始,同时执行,无顺序可言原创 2021-10-17 11:58:27 · 5164 阅读 · 0 评论 -
verilog中层次化的事件队列
所谓层次化的事件队列指的是用于调度仿真事件的不同的Verilog事件队列,在IEEE verilog标准中,层次化事件队列被看做一个概念模型。设计仿真工具的厂商如何来实现事件队列,关系到仿真器的效率,是技术秘诀。在IEEE 1364-1995 Verilog标准的5.3节中定义了层次化事件队列在逻辑上分为用于当前仿真时间的4个不同的队列,和用于下一段仿真时间的若干个附件队列;(1)动态事件队列阻塞赋值计算非阻塞赋值右边的表达式连续赋值执行$display命令计算原语的输入和输出的变化(2)停原创 2021-10-17 11:54:23 · 809 阅读 · 1 评论 -
verilog中的系统函数$random
$random系统函数提供了一个产生随机数的的方法,当函数被调用时返回一个32位的随机数,是一个带符号的整型数;$random的用法:$random % b 其中 b > 0, 产生一个范围在-b + 1 和 b - 1的随机数;reg [23:0] rand;rand = $random % 60; // -59 ~ 59还可以通过位并接操作产生一个值在0 ~ 59之间的数;rand = {$random % 60}; // 0 ~ 59...原创 2021-10-17 11:31:08 · 1910 阅读 · 0 评论
分享