Verilog的一些语法

 Verilog硬件描述语言 (HDL)曾经塑造 电子系统. 语言(有时叫 Verilog HDL)支持设计、证明和实施 模式, 数字式混杂信号电路 在各种各样的水平 抽象.

Verilog的设计师想要一种语言以句法相似于 C编程语言 因此它是跟熟悉工程师和欣然接受了。 语言是 区分大小写有a 前处理器 象C和少校 控制流 主题词例如“如果”和“当”,是相似的时。 格式化机制在打印的惯例和语言 操作员 并且他们 优先次序 也是相似的。

语言不同用一些根本方式。 Verilog用途开始或结束而不是卷曲括号定义代码块。 常数的定义在Verilog与他们的基地,因而这些一起要求位宽度不同。 然而Verilog 95和2001没有结构,尖或者递归子程序, SystemVerilog 现在包括这些能力。 终于,时间的概念-很重要对HDL-在C.不会被发现。

语言与常规不同 编程语言 因为施行 声明 不严密地是连续的。 Verilog设计包括模块阶层。 模块定义与一套输入、产品和双向口岸。 内部,模块包含导线和记数器名单。 一致和连续声明通过定义口岸、导线和记数器之间的关系定义了模块的行为。 连续声明是被安置的里面开始或块规和按顺序执行在块之内。 但所有一致声明和所有开始或块规在设计在平行,合格的Verilog被执行作为a 数据流语言. 模块可能也包含另一个模块一个或更多事例定义次级行为。

声明的一个子集在语言是 synthesizable. 如果模块在设计包含仅synthesizable声明,软件可以用于变换或综合设计入a netlist 那描述在硬件和连接将实施的基本成分。 netlist也许然后被变换入,例如,形式描述 标准单元 集成电路 (即。 ASIC)或a bitstream 为a 可编程逻辑阵列 (即。 a FPGA).

Verilog代表核实逻辑。

内容

  • 1 历史
    • 1.1 起点
    • 1.2 Verilog-95
    • 1.3 Verilog 2001年
    • 1.4 Verilog 2005年
    • 1.5 SystemVerilog
  • 2 例子
  • 3 常数的定义
  • 4 Synthesizeable修建
  • 5 最初和总
  • 6 分叉或加入
  • 7 竞争状态
  • 8 操作员
  • 9 系统任务
  • 10 程序语言接口(PLI)
  • 11 模仿软件
  • 12 参见
    • 12.1 另外的材料
    • 12.2 相关语言
  • 13 外部链接
    • 13.1 Verilog资源
    • 13.2 标准发展
    • 13.3 Verilog工具
    • 13.4 开放来源Verilog工具
    • 13.5 参考

历史

起点

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 posedgenegedge 声明在总条目之内。

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作用()。

模仿软件

对于信息关于Verilog模拟器,看见 Verilog模拟器名单.

 

参见

另外的材料

相关语言

外部链接

Verilog资源

标准发展

Verilog工具

  • NCSim
  • VCS -一台快速的Verilog模拟器,主要基于Unix。
  • ModelSim -混杂语言模拟器、支持的Verilog-2001和SystemVerilog。
  • 活跃HDL -混杂语言模拟器、支持的Verilog-2001和SystemVerilog。
  • LogicSim -一台便宜的窗口只Verilog模拟器。
  • VeriLogger极端 - Verilog 2001年模拟器为窗口和Unix

开放来源Verilog工具

参考

  • 托马斯, Donald, Moorby, Phillip “Verilog硬件描述语言” Kluwer学术出版者, Norwell, MA。 国际标准书号0-7923-8166-1
  • [1] 说明综合修建的康奈尔ECE576路线
  • Janick Bergerdon, “写试验台: HDL的功能证明塑造", 2000年, 国际标准书号0-7923-7766-4. (HDL试验台圣经)

 

generate

Verilog-2001添加了generate循环,允许产生module和primitive的多个实例化,同时也可以产生多个variable,net,task,function,continous assignment,initial和always。在generate语句中可以引入if-else和case语句,根据条件不同产生不同的实例化。

   generate语法有generate for, genreate if和generate case三种。

1. generate for例子:

   generate
   genvar i; //generate 8 samll fifo for in_data[i] 8X72
   for(i=0; i<NUM_QUEUES; i=i+1) begin: in_arb_queues //NUM_QUEUES = 8
      small_fifo
        #( .WIDTH(DATA_WIDTH+CTRL_WIDTH),
           .MAX_DEPTH_BITS(2))
      in_arb_fifo
        (// Outputs
         .dout                           ({fifo_out_ctrl[i], fifo_out_data[i]}),
         .full                           (),
         .nearly_full                    (nearly_full[i]),
       .prog_full                      (),
         .empty                          (empty[i]),
         // Inputs
         .din                            ({in_ctrl[i], in_data[i]}),
         .wr_en                          (in_wr[i]),
         .rd_en                          (rd_en[i]),
         .reset                          (reset),
         .clk                            (clk));
   end // block: in_arb_queues
   endgenerate

2.generate if例子:

   generate
      if (REG_WIDTH == WRITE_WIDTH) begin : new_data_a_generation
         assign new_data_a = merge_update ? merge_wr_data : held_wr_data_a;
      end
      else begin
         assign new_data_a = merge_update ?
            {{(REG_WIDTH - WRITE_WIDTH - 1){merge_wr_data_sign}}, merge_wr_data} :
            {{(REG_WIDTH - WRITE_WIDTH){held_wr_data_sign_a}}, held_wr_data_a};
      end
   endgenerate

PS:这两个例子都是netfpga源代码。

转载于:https://www.cnblogs.com/danh/archive/2010/12/29/1917798.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值