l generate语句

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

为此,Verilog-2001还增加了以下关键字:generate,endgenerate,genvar,localparam。 genvar为新增数据类型,存储正的integer。在generate语句中使用的index必须定义成genvar类型。localparam与 parameter有些类似,不过其不能通过redefinition改变值。除了可以在generate语句中使用if-else,case外,还能使 用for语句进行循环。

下面是一个使用generate的例子,根据a_width和b_width的不同,实例化不同的multiplier。

module multiplier (a, b, product);

parameter a_width = 8, b_width = 8;

localparam product_width = a_width+b_width;

input [a_width-1:0] a;

input [b_width-1:0] b;

output[product_width-1:0]product;

generate

if((a_width < 8) || (b_width < 8))

CLA_multiplier #(a_width, b_width)

u1 (a, b, product);

else

WALLACE_multiplier #(a_width, b_width)

u1 (a, b, product);

endgenerate

endmodule

在下面的例子中,在generate语句中使用了for语句。

module Nbit_adder (co, sum, a, b, ci);

parameter SIZE = 4;

output [SIZE-1:0] sum;

output co;

input [SIZE-1:0] a, b;

input ci;

wire [SIZE:0] c;

genvar i;

assign c[0] = ci;

assign co = c[SIZE];

generate

for(i=0; i<SIZE; i="i"+1)

begin:addbit

wire n1,n2,n3; //internal nets

xor g1 ( n1, a[i], b[i]);

xor g2 (sum[i],n1, c[i]);

and g3 ( n2, a[i], b[i]);

and g4 ( n3, n1, c[i]);

or g5 (c[i+1],n2, n3);

end

endgenerate

endmodule

generate执行过程中,每一个generated net在每次循环中有唯一的名字,比如n1在4次循环中会产生如下名字:

addbit[0].n1

addbit[1].n1

addbit[2].n1

addbit[3].n1

这也是为什么在begin-end块语句需要名字的一个原因。同样,实例化的module,gate等在每次循环中也有不同的名字。

addbit[0].g1

addbit[1].g1

addbit[2].g1

addbit[3].g1

l constant functions

Verilog的语法要求定义向量的宽度或数组大小时其值必须是一个确定的数字或一个常量表达式。比如:

parameter WIDTH = 8;

wire [WIDTH-1:0] data;

在 Verilog-1995标准中,常量表达式只能是基于一些常量的算术操作。而在Verilog-2001中增加了constant function,其定义与普通的function一样,不过constant function只允许操作常量。下面是一个使用constant function的例子,clogb2函数返回输入值2次方的次数。

module ram (address_bus, write, select, data);

parameter SIZE = 1024;

input [clogb2(SIZE)-1:0] address_bus;

...

function integer clogb2 (input integer depth);

begin

for(clogb2=0; depth>0; clogb2=clogb2+1)

depth = depth >> 1;

end

endfunction

...

endmodule

l Indexed vector part selects

在Verilog-1995中,可以选择向量的任一位输出,也可以选择向量的连续几位输出,不过此时连续几位的始末数值的index需要是常量。而在Verilog-2001中,可以用变量作为index,进行part select。

[base_expr +: width_expr] //positive offset

[base_expr -: width_expr] //negative offset

其中base_expr可以是变量,而width_expr必须是常量。+:表示由base_expr向上增长width_expr位,-:表示由base_expr向上递减width_expr位。例如:

reg [63:0] word;

reg [3:0] byte_num; //a value from 0 to 7

wire [7:0] byteN = word[byte_num*8 +: 8];

如果byte_num的值为4,则word[39:32]赋值给byteN。

l 多维数组

Verilog-1995只允许一维数组,而Verilog-2001允许多维数组。

//1-dimensional array of 8-bit reg variables

//(allowed in Verilog-1995 and Verilog-2001)

reg [7:0] array1 [0:255];

wire [7:0] out1 = array1[address];

//3-dimensional array of 8-bit wire nets

//(new for Verilog-2001)

wire [7:0] array3 [0:255][0:255][0:15];

wire [7:0] out3 = array3[addr1][addr2][addr3];

而 且在Verilog-1995中不能对一维数组中取出其中的一位,比如要取出上面array1[7][5],需要将array1[7]赋给一个reg变量 比如arrayreg <= array1[7],再从arrayreg中取出bit5,即arrayreg[5]。而在Verilog-2001中,可以任意取出多维数组中的一位或 连续几位,比如:

//select the high-order byte of one word in a

//2-dimensional array of 32-bit reg variables

reg [31:0] array2 [0:255][0:15];

wire [7:0] out2 = array2[100][7][31:24];

l 符号运算

在Verilog-1995中,integer数据类型为有符号类型,而reg和wire类型为无符号类型。而且integer大小固定,即为32位数据。在Verilog-2001中对符号运算进行了如下扩展。

Reg和wire变量可以定义为有符号类型:

reg signed [63:0] data;

wire signed [7:0] vector;

input signed [31:0] a;

function signed [128:0] alu;

函数返回类型可以定义为有符号类型。

带有基数的整数也可以定义为有符号数,在基数符号前加入s符号。

16'hC501 //an unsigned 16-bit hex value

16'shC501 //a signed 16-bit hex value

操作数可以在无符号和有符号之间转变。通过系统函数$signed和$unsigned实现。

reg [63:0] a; //unsigned data type

always @(a) begin

result1 = a / 2; //unsigned arithmetic

result2 = $signed(a) / 2;//signed arithmetic

end

增加了算术移位操作,在Verilog-1995中只有逻辑移位操作。比如D的初始值为8’b10100011,则:

D >> 3 //logical shift yields 8'b00010100

D >>> 3 //arithmetic shift yields 8'b11110100

l 指数运算

Verilog-2001中增加了指数运算操作,操作符为**。

always @(posedge clock)

result = base ** exponent;

l 递归函数和任务

在Verilog-2001中增加了一个新的关键字:automatic。该关键字可以让任务或函数在运行中从新调用该任务和函数。

function automatic [63:0] factorial;

input [31:0] n;

if (n == 1)

factorial = 1;

else

factorial = n * factorial(n-1);

endfunction

l 组合逻辑敏感信号通配符

在组合逻辑设计中,需要在敏感信号列表中包含所有组合逻辑输入信号,以免产生锁存器。在大型的组合逻辑中比较容易遗忘一些敏感信号,因此在Verilog-2001中可以使用@*包含所有的输入信号作为敏感信号。

always @* //combinational logic sensitivity

if (sel)

y = a;

else

y = b;

l 使用逗号隔开敏感信号

Verilog-2001中可以用逗号来代替or隔开敏感信号。

always @(a or b or c or d or sel)

always @(a, b, c, d, sel)

l Automatic width extension beyond 32 bits

在Verilog-1995中,在不指定基数的情况下为大于32位的变量赋高阻值,只能使其低32位为高阻值,其他高位会被设置为0,此时需要指定基数值才能将高位赋值为高阻。

Verilog-1995:

parameter WIDTH = 64;

reg [WIDTH-1:0] data;

data = 'bz; //fills with 'h00000000zzzzzzzz

data = 64'bz; //fills with 'hzzzzzzzzzzzzzzzz

而在Verilog-2001中并没有这一限制。

Verilog-2001:

parameter WIDTH = 64;

reg [WIDTH-1:0] data;

data = 'bz; //fills with 'hzzzzzzzzzzzzzzzz

l 组合端口及数据类型定义

在Verilog-1995中,端口定义和数据类型定义需要在两条语句中执行,而Verilog-2001中可以将其组合在一起。

module mux8 (y, a, b, en);

output reg [7:0] y;

input wire [7:0] a, b;

input wire en;

l ANSI格式的端口定义

在定义端口的同时并定义其数据类型,比上一个改进更简洁。

module mux8 (output reg [7:0] y,

input wire [7:0] a,

input wire [7:0] b,

input wire en );

function [63:0] alu (

input [63:0] a, b,

input [7:0] opcode );

l 定义reg并初始化

在Verilog-1995中定义和初始化reg需要两条语句,而在Verilog中可以合成一条语句。

Verilog-1995:

reg clock;

initial

clk = 0;

Verilog-2001:

reg clock = 0;

Verilog-2001新增特性的更多相关文章

  1. Verilog 2001 `default_nettype none

    在Verilog 1995規定,對於沒宣告的信號會自動視為wire,這樣常常造成debug的困難,Verilog 2001另外定義了`default_nettype none,將不再自動產生wire. ...

  2. verilog 2001中的一些新语法

    比较有用的:1,generate语句,但需注意,generate-for中变量范围是已知的确定值, generate-case,generate-if语句中变量都必须是固定的, generate必须跟 ...

  3. 随笔分类 - [C#6] 新增特性

    C#6.0中引入的基本特性总结 [C#6] 7-索引初始化器 摘要: 0. 目录 C#6 新增特性目录 1. 老版本的代码 早C#3中引入的集合初始化器,可是让我们用上面的语法来在声明一个字典或者集合 ...

  4. hive 0.10 0.11新增特性综述

    我们的hive版本升迁经历了0.7.1 -> 0.8.1 -> 0.9.0,并且线上shark所依赖的hive版本也停留在0.9.0上,在这些版本上有我们自己的bug fix patch和 ...

  5. Performance Tuning guide 翻译 || Performance Tuning Guide 11G中新增特性

    CSDN 对格式支持比較弱.能够到http://user.qzone.qq.com/88285879/blog/1399382878 看一致的内容. Performance Tuning Guide  ...

  6. MongoDB 3.0新增特性一览

    转自:http://blog.sina.com.cn/s/blog_48c95a190102vedr.html 引言 在历经版本号修改(2.8版本直接跳到3.0版本)和11个rc版本之后,MongoD ...

  7. 10.1 ES6 的新增特性以及简单语法

    ES6 的新增特性以及简单语法  let 和 const 模板字符串 箭头函数 对象单体模式 es6面向对象 模块化  let 和 const 之前一直用 var 来声明变量,ES6 新增 let 和 ...

  8. CSS3新增特性详解(二)

    上篇博文主要介绍了CSS3新增特性中的静态特性,比如新的选择器.多背景图.阴影.渐变等.本文主要介绍CSS3中新增的动态特性,如过度.动画.变形等. transitian:  -webkit-tran ...

  9. ES6(函数新增特性)

    ES6(函数新增特性) 1.函数参数默认值 没有 y 时,默认就是world 有 y 时,输出值即可 (错误) (C有默认值,正确) 默认值后面不能再有没有默认值的变量 2.作用域 y 取其前面的 x ...

  10. H5新增特性之语义化标签

    H5新增特性之语义化标签 语义化标签顾名思义标签有自己的含义,浏览器或者程序员一看就知道是什么.在HTML 5出来之前,我们用div来表示页面章节,但是这些div都没有实际意义.(即使我们用css样式 ...

随机推荐

  1. spring security采用基于持久化 token 的方法实现的remember me功能

    采用该方法相较于简单加密方式安全一些.具体的原理见 http://wiki.jikexueyuan.com/project/spring-security/remember-me.html  一.建立 ...

  2. vs2013 浏览器 browserlink 不停访问

  3. Java中sleep()与wait()的区别

    第一种解释: 功能差不多,都用来进行线程控制,他们最大本质的区别是:sleep()不释放同步锁,wait()释放同步缩.       还有用法的上的不同是:sleep(milliseconds)可以用 ...

  4. JNIjw01

    1.VC6(CPP)的DLL代码: #include<stdio.h> #include "jniZ_JNIjw01.h" JNIEXPORT void JNICALL ...

  5. JNI_Z_05_方法的操作(没有String类型的参数)

    1.步骤: (1).获取 jclass (2).获取 method的id (3).调用 method ZC: 貌似 JNI里面 操作 类的方法,完全是 无视 访问权限的... 然而 static的方法 ...

  6. Linux软件安装(二)

    1. 安装软件时,如果依赖的文件是 .so 类型的文件(so文件是谋个文件的小功能模块,如果php.ini中设置的模块引用就是 .so文件) ,这时被依赖的软件要安装完整的软件,一般可以根据 .so ...

  7. leetcode 2SUM

         ; i < numbers.size(); ++i){             ; i < v.size(); i++){             ; j < v.size ...

  8. 扫描局域网中Gogs服务器(ruby)

    scanGogs.rb #!/usr/bin/env ruby require 'net/http' require 'thread' require 'english' # config CONFI ...

  9. 将本地代码提交到gitlub

    第一步:建立git仓库  cd到本地项目根路径下面,执行git命令:git  init $ git init Initialized empty Git repository in D:/my_wor ...

  10. 【Python】UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3

    问题如下: UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3 解决方法: 程序开始加上下面两句 sys ...