集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1554|回复: 4

小谈Verilog

[复制链接]
fpga_feixiang 发表于 2017-12-11 09:18:23 | 显示全部楼层 |阅读模式
历史

起点

Verilog被发明了 菲尔Moorby 并且Prabhu Goel在冬天1983/1984期间在自动化的联合设计系统(以后改了名 门户设计自动化) 1985 作为塑造语言的硬件。 门户设计自动化以后被购买了 节奏设计系统 在 1990. 节奏现在有充分的所有权到门户的Verilog和VerilogXL模拟器 逻辑模拟器.


Verilog-95

以增长的成功 VHDL 在,节奏决定使语言可利用为开放时候 标准化. 节奏转移了Verilog入公共领域在之下 打开Verilog国际 (OVI) (现在以著名 Accellera)组织。 Verilog以后递交了 IEEE 并且成为了 IEEE 标准1364-1995,共同地指Verilog-95。


Verilog 2001年

引伸对Verilog-95递交回到IEEE包括缺乏用户在原始的Verilog标准发现了。 这些引伸成为了 IEEE 标准1364-2001以Verilog-2001著名。

Verilog-2001是重大升级从Verilog-95。 首先,它增加明确支持为(2补全)签字的网和可变物。 早先,代码作者必须使用笨拙位级操作进行签署操作(例如,简单的8位加法的运载位要求布尔代数的一个明确描述确定它的正确价值。)同一个作用在Verilog-2001之下可以由其中一名固定操作员更加简洁地描述: +, -,/, * >>>。 引起或endgenerate修建(相似与VHDL引起或endgenerate)允许Verilog-2001通过正常决定操作员(case/if/else)控制事例和声明instantiation。 使用引起或endgenerate, Verilog-2001罐头instantiate事例,以对各自的事例的连通性的控制。 几项新的系统任务改进了文件输入/输出。 并且终于,介绍几句法加法改进代码可读性(即。 总@*、命名参量代理佣金、C样式作用或者任务或者模块倒栽跳水声明。)

Verilog-2001是多数支持的Verilog统治味道商业EDA软件包。


Verilog 2005年

不混淆与 SystemVerilog, Verilog 2005年 (IEEE 标准1364-2005)包括较小更正、spec阐明和几新的语言特色(例如uwire主题词。)

Verilog标准的一个分开的部分, Verilog-AMS企图集成塑造与传统Verilog的模式和复合信号。


SystemVerilog

主要文章: SystemVerilog
Systemverilog是a 超集 Verilog-2005,以援助设计证明和设计塑造的许多新的特点和有能力。

高级证明语言出现例如 OpenVera和Verisity的E语言鼓励了发展 Superlog 由Co设计Automation Inc. Co设计自动化公司以后被购买了 Synopsys. Superlog和维拉的基础捐赠了 Accellera以后成为 IEEE 标准P1800-2005 : SystemVerilog。


例子
A 你好世界节目 如下所示:

模块扼要;最初开始$display (“你好世界! ”);$finish;末端endmodule
一个简单例子的二 啪嗒啪嗒的响声 跟随:

模块上层(时钟,重新设置);输入时钟;输入重新设置;reg flop1;reg flop2;总@ (posedge重新设置或posedge时钟),如果(重新设置)开始flop1 <= 0;flop2 <= 1;末端开始flop1 <= flop2;flop2 <= flop1;末端endmodule
“<= "操作员在verilog是另一个方面的它是硬件描述语言与一种正常程序语言相对。 这通认作为“非阻塞”任务。 当模拟运行时,所有信号分配与“<= "操作员有他们的预定的任务发生,在发生在同样此刻期间的所有声明执行了之后。 在所有声明为一个事件之后被执行了,预定的任务进行。 这使它更加容易编码同时发生的行为。

在上述例子, flop1被分配flop2,并且flop2被分配flop1。 这些声明在同一时期是被执行的事件。 因为任务编码与“<= "非阻塞操作员,预定任务发生在事件的结尾。 到那时,所有读对flop1,并且flop2将使用他们有在时间事件初的价值。

这意味着任务的顺序是毫不相关的,并且导致同一个结果。 flop1和flop2将交换价值每个时钟。

另一个选择为任务是“=”操作员,并且这通认作为一项阻拦的任务。 当“=”操作员使用时,他们发生很象一种程序语言的事在序列发生。

在上述例子,如果声明使用了“=”阻拦操作员而不是”< = ",声明的顺序将影响行为: 重新设置将设置flop2到1和flop1到0。 时钟事件然后将设置flop1对flop2,是1在重新设置以后。 下个声明随后将被执行和设置flop2对flop1,现在是1。 而不是交换重视每个时钟, flop1和flop2将成为1并且保持那个方式。

一个例子 柜台 电路跟随:

模块Div20x (rst、clk、cet、等概率圆,计数, tc);//标题‘划分由20柜台与使能’ //使能等概率圆是时钟使能仅//使能CET是时钟使能,并且//使TC使用Verilog语言参量大小输出//柜台= 5;参量长度= 20;输入rst; //这些输入或产品代表输入clk; 与模块的//连接。输入cet;输入等概率圆;产品[大小1 :0]计数;产品tc;reg [大小1 :0]计数; 被分配的//信号//在一个// (或最初)块//之内必须总是类型reg导线tc; //其他信号是类型导线如下总声明是一个平行的//施行声明的// //总任何时侯执行信号// rst或clk转折从低落到上流@ (posedge clk或posedge rst),如果(rst) //这导致cntr计数的重新设置 <= 5 ' b0;如果(cet &&等概率圆) //使能两真实开始,如果(计数==长度1)计数 <= 5 ' b0;计数 <=计数+ 5 ' b1; // 5 ' b1是5位末端                        //宽和相等的//到价值1。// tc的价值连续被分配表示的价值分配tc =的// (cet && (计数==长度1));endmodule
延迟的例子:

...reg a, b, c, d;导线e;…@ (b或e)总开始a = b & e;b = a | b;#5 c = b;d = #6 c ^ e;末端
上面条目总说明用途方法的另一个类型,即。 条目在名单变动总执行,在其中任一个体,即时侯。 b或e变动。 当这些中的一个改变时,立刻a和b被赋予新的价值。 在5个时间单位延迟, c被分配之后b的价值和c ^ e的价值在一家无形的商店被卷起。 然后在6个多时间单位以后, d被赋予被卷起的价值。

被驾驶从过程内部的信号(最初或总块)必须是类型reg。 被驾驶从境外过程的信号必须是类型导线。 主题词reg必要不暗示一个硬件寄存器。


常数的定义
常数的定义在Verilog支持宽度参量的加法。 基本的句法是:

<宽度在位>‘<基本的信件><数字>

例子:

12 ' h123 -十六进制123 (使用12位)
20 ' d44 -小数44 (使用20位- 0个引伸是自动的)
4 ' b1010 -二进制1010年(使用4位)
6 ' o77 -八77 (使用6位)

Synthesizeable修建
如被提及早先,有可以用于代表硬件的几块基本的模板。

// Mux例子-三种方式做同一件事。//第一个例子使用连续的任务导线;分配= sel ? a : b;//第二个例子使用一个做法//完成同一件事。reg;@ (a或b或者sel)总开始案件(sel) 1 ' b0 : = b;1 ' b1 : = a;endcase末端最后// -您在//程序结构能使用if/else。reg;总@ (a或b或者sel),如果(sel) = a;= b;
下个有趣的结构是一个透明门闩; 它将通过输入对产品,当门信号为“全部转嫁”被设置,并且夺取输入并且存放它在门信号的转折“举行”。 当门被设置对“举行”时,产品将依然是稳定不管输入信号。 在例子在“全部转嫁之下”级门是价值的,如果条目是真实的,即。 门= 1。 这读“如果门是真实的,声浪连续哺养对latch_out”。 一旦,如果条目是错误的,最后价值在latch_out将依然是并且是声浪的价值的独立。

//透明门闩例子reg;总@ (门或声浪),如果(门) =声浪; //通过状态这里没有需要的//笔记。 当门高时,易变的//将跟随声浪的价值。//,当门去低,将保持恒定。
啪嗒啪嗒的响声是下块重大模板; 在verilog, D拍击声是最简单的,并且它可以被塑造如下:

reg q;总@ (posedge clk) q <= d;
重大事对在例子中的通知是对非阻塞任务的用途。 一种基本的概测法是使用 <= 当有a posedge 或 negedge 声明在总条目之内。

D拍击声的变形是一个以异步重新设置; 有大会重新设置状态将是一个,如果条目在声明之内。

reg q;总@ (被重新设置的posedge clk或posedge),如果(重新设置) q <= 0;q <= d;
下个变形包括异步重新设置和异步安置状态; 大会再开始活动,即。 重新设置期限由集合期限跟随。

reg q;总@ (posedge被设置的clk或posedge重新设置或posedge),如果(重新设置) q <= 0;如果(设置) q <= 1;q <= d;
最后的基本的变形是实施一阵D拍击声与哺养它的输入的mux的一个。 mux有d输入和反馈从拍击声。 这允许一个装门的装载作用。

//基本的结构用总一条明确反馈通道@ (posedge clk),如果(门) q <= d;q <= q; //明确反馈通道更加共同的结构假设的//反馈是当前//这是的一个安全假定,因为这是怎么//硬件编译器将解释它。 这个结构//看很象门闩。 区别是// ''' @ (posedge clk) '''和非阻塞'''< = '''总// @ (posedge clk),如果(门) q <= d; // “” mux “被暗示”
看原始的逆例子您能看半新的基本的异步重新设置拍击声和装门的输入拍击声的组合。 记数器可变物 计数 调整到零在上升边或 rst. 当 rst 是0,可变物 计数 将装载新的数据,当 cet &&等概率圆 是真实的。

最初和总
有宣称verilog过程二种不同方式。 这些是 总 并且 最初 主题词。 总 主题词在伴随的事件控制(@)条目表明一个自由振荡的过程那触发器。 最初 主题词表明过程一次确切地执行。 两修建开始施行在模拟器时间0,并且两个执行直到块的末端。 一个块总一次到达了它的末端,它被重新编排(再)。 它是一种常见的误解相信一个最初的块将执行,在一个总块之前。 实际上,认为最好的 最初-块作为特别情形 总-块,终止的一,在它第一次之后完成。

//Examples :最初开始a = 1; //赋予价值到reg a在时间0 #1; //等待1个时间单位b = a; //总赋予reg a到reg b末端@ (a或b) //的价值, a或b变动,跑过程开始,如果(a) c = b;d = ~b;结束//做与这个块,现在回到上面(即。 @事件控制)总@ (posedge a)/跑,每当reg a有低落对高变动a <= b;
这些是经典用途为这二个主题词,但有二重大另外的用途。 这些的最共同性是 总 没有的主题词 @() 敏感性名单。 使用总如所示如下是可能的:

总不要开始//总开始执行在时间0和停止clk = 0; //设置了clk对0 #1; //等待1时间单位clk = 1; //设置了clk对1 #1; //等待1个时间单位末端//继续执行-,因此继续在开始的上面
总 主题词行动相似于“C”修建 当时(1) {。} 在感觉它永远将执行。

另一个有趣的例外是用途对 最初 主题词增加 永远 主题词。

如下例子与是功能上相同的 总 上面的例子。

最初//永远以时间0开始并且重覆开始或末端永远开始clk = 0; //设置了clk对0 #1; //等待1时间单位clk = 1; //设置了clk对1 #1; //等待1个时间单位末端

分叉或加入
分叉或加入 verilog用于对创造平行的过程。 所有声明(或块)在叉子之间或加入对同时开始施行在施行流程击中 叉子. 施行在以后继续 加入 在最长的连续声明或块的完成在之间 叉子 并且 加入.

最初的叉子$write (“A”); //印刷品炭灰A $write (“B”); //印刷品炭灰B开始#1; //等待1个时间单位$write (“C”); /印刷品炭灰C末端加入
方式在上面被写,有或者序列“ABC”是可能的或“BAC”打印。 模仿顺序在第一$write和第二$write之间取决于模拟器实施。 这说明其中一个最大的问题与Verilog。 您能有竞争状态,语言执行单不保证结果。


竞争状态
施行顺序没有在verilog之内总被保证。 这可能由一个经典例子最好说明。 考虑代码片断如下:

标注姓名起首字母a = 0;最初b = a;最初开始#1;$display (“b=%b”, a, b的价值a=%b价值);末端
什么为a和b的价值将被印? 井-或许它可能是0和0或者0和X! 这所有依靠大约最初的块的施行。 如果模拟器调度程序从文件的上面运作对底部,则您会得到0和0。 如果它从模块的底部开始并且工作,则b在模仿初将接受a的原始价值 以前 它初始化了到0 (没被设置的其中任一可变物的价值explicitily被设置对X.)这是的方式您在模仿能体验一个竞争状态。 如此小心! 注意第3个最初块将执行,您期望由于#1那里。 那是不同的点在时间轮子在更加早期的最初的块的时期0,因而两个之外完成了施行。


操作员
操作员类型        操作员标志        操作执行了
逐位        ~        1补全
&        逐位和
|        逐位或
^        逐位XOR
~^或^~        逐位XNOR
逻辑         !        没有
&&        并且
||        或
减少        &        减少和
~&        减少与非
|        减少或
~|        减少亦不
^        减少XOR
~^或^~        减少XNOR
算术        +        加法
-        减法
-        2补全
*        增殖
/        分部
**        方次数(*Verilog-2001)
关系        >        大于
<        较少比
>=        大于或等于
<=        小于或等于
==        逻辑平等(位价值1 ' bX从比较被取消)
!=        逻辑不平等(位价值1 ' bX从比较被取消)
===        4状态逻辑平等(位价值1 ' bX被采取作为印刷错误)
!==        4状态逻辑不平等(位价值1 ' bX被采取作为印刷错误)
转移        >>        逻辑正确的转移
<<        逻辑左移
>>>        算术正确的转移(*Verilog-2001)
<<<        算术左移(*Verilog-2001)
联系        { , }        联系
复制        {{ }}        复制
有条件         ? :        有条件

系统任务
系统任务是可利用处理简单的输入/输出,并且各种各样的设计测量起作用。 所有系统任务加前缀与 $ 与用户任务和作用区别他们。 这个部分提出最常用的任务一个最后的名单。 它绝不是一张全面名单。

$display -筛选线的印刷品跟随由一自动换行符。
$write -筛选线的印刷品,不用换行符。
$swrite -印刷品到可变物没有换行符的一条线。
$sscanf -从可变物读格式指定的串。 (*Verilog-2001)
$fopen -对文件打开把柄(读或写)
$fdisplay -写归档一自动换行符跟随的线。
$fwrite -写归档线,不用换行符。
$fscanf -读从文件格式指定的串。 (*Verilog-2001)
$fclose -关闭和发布开放文件处理。
$readmemh -读不吉利的东西文件内容入记忆列阵。
$readmemb -读二进制文件内容入记忆列阵。
$monitor -印刷品所有列出的可变物,当其中任一改变价值。
$time -当前模仿时间的价值。
$dumpfile -宣称VCD (价值变更转储)格式输出文件名字。
$dumpvars -打开并且倾销可变物。
$dumpports -打开并且倾销可变物以延长的VCD格式。
$random -退回任意价值。

程序语言接口(PLI)
程序语言接口提供一位程序员以转移的控制从Verilog给用C语言写的节目作用。 它是 正式地 贬抑 由IEEE Std 1364-2005倾向于新 Verilog程序接口完全地替换PLI。

PLI使Verilog与用C语言写的其他节目合作例如 测试鞔具, 指令组模拟器 微型控制器, 调试器等等。 例如,它提供用于写和读当前Verilog任务或作用的论据分别名为tf_putlongp ()和tf_getlongp的C作用()。
晓灰灰 发表于 2017-12-11 09:44:31 | 显示全部楼层
小谈Verilog
zxopenlz 发表于 2017-12-14 09:10:07 | 显示全部楼层
小谈Verilog
奋斗的小孩 发表于 2017-12-23 19:53:34 | 显示全部楼层
这个还是可以的,省的百度了
大鹏 发表于 2018-4-9 09:20:58 | 显示全部楼层
讲的很清楚
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-4-26 04:24 , Processed in 0.064417 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表