Verilog 操作运算符

算术运算符

+,-,*,/,**(加/减/乘/除/幂运算),乘法运算的结果的位宽是乘数和被乘数位宽的和。

在进行整数的除法运算时,结果要略去小数部分,只取整数部分;而进行取模运算时(%,亦称作求余运算符)结果的符号位采用模运算符中第一个操作数的符号。

-10%3 =-1 11%-3 结果为2

注意:在进行算术运算时,如果某一个操作数有不确定的值x,则整个结果也为不确定值x。下面的代码演示了算术运算符的操作,其结果为:

如果不指定reg signed类型,负数的运算会被当作无符号数运算,从而得到错误的结果。

Compiler version M-2017.03-SP2-11; Runtime version M-2017.03-SP2-11;  Dec 28 09:33 2018
          32 +          15 =          47
          32 -          15 =          17
          15 -          32 =         -17
          32 *          15 =         480
          32 *         -32 =       -1024
          32 /          15 =           2
         -32 mod          15 =          -2
          32 mod          -3 =           2
           3 **           2 =           9
         32 +         15 =         47
         32 -         15 =         17
         15 -         32 = 4294967279
         32 *         15 =        480
         32 * 4294967264 = 4294966272
         32 /         15 =          2

4294967264 mod         15 =         14
         32 mod 4294967293 =         32
          3 **          2 =          9
            V C S   S i m u l a t i o n   R e p o r t

`timescale 1ns/1ns

module operator;

  reg signed [31:0] a = 32;
reg signed [31:0] b = 15;
reg signed [31:0] c = -32;
reg signed [31:0] d = -3;
reg signed [31:0] e = 3;
reg signed [31:0] f = 2;
reg signed [31:0] r = 1;
reg [31:0] a1 = 32;
reg [31:0] b1 = 15;
reg [31:0] c1 = -32;
reg [31:0] d1 = -3;
reg [31:0] e1 = 3;
reg [31:0] f1 = 2;
reg [31:0] r1 = 1;
initial begin
r = a + b;
$display("%d + %d = %d",a, b, r);
r = a - b;
$display("%d - %d = %d",a, b, r);
r = b - a;
$display("%d - %d = %d",b, a, r);
r = a * b;
$display("%d * %d = %d",a, b, r);
r = a * c;
$display("%d * %d = %d",a, c, r);
r = a / b;
$display("%d / %d = %d",a, b, r);
r = c % b;
$display("%d mod %d = %d",c, b, r);
r = a % d;
$display("%d mod %d = %d",a, d, r);
r = e ** f;
$display("%d ** %d = %d",e, f, r); r1 = a1 + b1;
$display("%d + %d = %d",a1, b1, r1);
r1 = a1 - b1;
$display("%d - %d = %d",a1, b1, r1);
r1 = b1 - a1;
$display("%d - %d = %d",b1, a1, r1);
r1 = a1 * b1;
$display("%d * %d = %d",a1, b1, r1);
r1 = a1 * c1;
$display("%d * %d = %d",a1, c1, r1);
r1 = a1 / b1;
$display("%d / %d = %d",a1, b1, r1);
r1 = c1 % b1;
$display("%d mod %d = %d",c1, b1, r1);
r1 = a1 % d1;
$display("%d mod %d = %d",a1, d1, r1);
r1 = e1 ** f1;
$display("%d ** %d = %d",e1, f1, r1);
end endmodule

位运算符

按位取反~ 、按位与 & 、按位或 | 、按位异或 ^ 、按位同或 ^~(~^),在不同长度的数据进行位运算时,系统会自动的将两个数右端对齐,位数少的操作数会在相应的高位补0。

下面位运算符的代码例子:

Compiler version M-2017.03-SP2-11; Runtime version M-2017.03-SP2-11;  Dec 28 10:00 2018

0101010110101010 & 11111111 = 0000000010101010

0101010110101010 | 11111111 = 0101010111111111

~0101010110101010  1010101001010101

0101010110101010 ^ 11111111 = 0101010101010101

0101010110101010 ~^ 11111111 = 1010101010101010

0101010110101010 ^~ 11111111 = 1010101010101010
            V C S   S i m u l a t i o n   R e p o r t

`timescale 1ns/1ns

module operator;

  reg  [15:0] a = 16'b0101010110101010;
reg [7:0] b = 8'hff;
reg [15:0] r = 1;
initial begin
r = a & b;
$display("%b & %b = %b",a, b, r);
r = a | b;
$display("%b | %b = %b",a, b, r);
r = ~a ;
$display("~%b %b", a, r);
r = a ^ b;
$display("%b ^ %b = %b",a, b, r);
r = a ~^ b;
$display("%b ~^ %b = %b",a, b, r);
r = a ^~ b;
$display("%b ^~ %b = %b",a, b, r); end endmodule

逻辑运算符

逻辑运算符用来连接条件表达式,它的返回值是1位的。逻辑运算符包括逻辑与 &&、逻辑或 ||、逻辑非 !,其中&&和||是双目运算符,其优先级别低于关系运算符,而 !高于算术运算符。

关系运算符

< 、 > 、 <= 、 >= 如果关系运算是假的,则返回值是0,如果声明的关系是真的,则返回值是1。 关系运算符的优先级别低于算数运算符。关系运算返回值也是1位的。

逻辑运算符,关系运算符,包括下面的等式运算符,通常都是用来作条件判断的,比如if语句的判断条件。

下面的代码演示了这三种运算的结果:

Compiler version M-2017.03-SP2-11; Runtime version M-2017.03-SP2-11;  Dec 28 12:42 2018

(0 && 1) = 0

(0 || 1) = 1

(!0) = 1

(00010100 >= 01011010) = 0

(00010100 < 01011010) = 1

(00010100 == 01011010) = 0

(0 == x) = x

(0 === x) = 0

$finish called from file "operator2.v", line 35.

`timescale 1ns/1ns

module operator;

  reg   a = 1'b0;
reg b = 1'b1;
reg r = 1'b1;
reg [7:0] c = 8'd20;
reg [7:0] d = 8'd90;
initial begin
r = (a && b);
$display("(%b && %b) = %b",a, b, r);
#10
r = (a || b);
$display("(%b || %b) = %b",a, b, r);
#10
r = !a;
$display("(!%b) = %b",a, r);
#10
r = (c>=d);
$display("(%b >= %b) = %b",c, d, r);
#10
r = (c<d);
$display("(%b < %b) = %b",c, d, r);
#10
r = (c==d);
$display("(%b == %b) = %b",c, d, r);
#10
r = (a==1'bx);
$display("(%b == x) = %b",a, r);
#10
r = (a===1'bx);
$display("(%b === x) = %b",a, r);
#10
$finish;
end endmodule

等式运算符

== 、!= 、===、!== 符号之间不能有空格。

“==”和“!=”称作逻辑等式运算符,其结果由两个操作数的值决定。由于操作数可能是x或z,其结果可能为x;

“===”和“!==”常用于case表达式的判别,又称作case等式运算符。其结果只为0和1,如果操作数中存在x和z,那么操作数必须完全相同结果才为1,否则为0。

逻辑等式运算符和case等式运算符的区别

===

0

1

x

z

==

0

1

x

z

0

1

0

0

0

0

1

0

x

x

1

0

1

0

0

1

0

1

x

x

x

0

0

1

0

x

x

x

x

x

z

0

0

0

1

z

x

x

x

x

移位运算符

逻辑移位运算符:<< 、 >> , a>>n其中a代表要进行移位的操作数,n代表要移几位。这两种移位运算都用0来填补移出的空位。算术移位运算符:<<<, >>>, <<<右边补0,>>>左边补MSB(最高有效位,仅对有符号数),若MSB是x或z,则填x。

Compiler version M-2017.03-SP2-11; Runtime version M-2017.03-SP2-11;  Dec 28 13:17 2018

(10101001011100000001001000110100>>1) = 01010100101110000000100100011010

(10101001011100000001001000110100>>1) = 01010010111000000010010001101000

(10101001011100000001001000110100>>>1) = 01010100101110000000100100011010

(10101001011100000001001000110100<<<1) = 01010010111000000010010001101000

(10101001011100000001001000110100>>>5) = 11111101010010111000000010010001

(10101001011100000001001000110100>>5) = 00000101010010111000000010010001

$finish called from file "operator3.v", line 26.

`timescale 1ns/1ns

module operator;

  reg [31:0]  a = 32'ha9701234;
reg signed [31:0] b = 32'ha9701234;
reg [31:0] r = 32'b1;
initial begin
r = (a >> 1);
$display("(%b>>1) = %b",a, r);
#10
r = (a << 1);
$display("(%b>>1) = %b",a, r);
#10
r = (a >>> 1);
$display("(%b>>>1) = %b",a, r);
#10
r = (a <<< 1);
$display("(%b<<<1) = %b",a, r);
#10
r = (b >>> 5);
$display("(%b>>>5) = %b",b, r);
#10
r = (b >> 5);
$display("(%b>>5) = %b",b, r);
$finish;
end endmodule

位拼接运算符

{信号1的某几位,信号2的某几位,......信号n的某几位} 将某些信号的某些位列出来,中间用逗号分开,最后用大括号括起来表示一个整体的信号。

在位拼接的表达式中不允许存在没有指明位数的信号。

{a,b[3:0],w,3'b101} //等同于  {a,b[3],b[2],b[1],b[0],w,1b'1,1'b0,1'b1}

{4{w}} //等同于{w,w,w,w}

{b,{3{a,b}}} //等同于{b,a,b,a,b,a,b} 这里面的3、4必须是常量表达式。

缩减运算符

这是单目运算符,也包括与、或、非运算。运算规则与位运算相似,不过是对单个运算符的每一位逐步运算,最后的运算结果是一位的二进制数。

c=&B; //意思同c=((B[0]&B[1]) &B[2] ) & B[3];

条件运算符

A?B:C, 如果表达式A为true(1),则结果为B,如果为false(0)结果为C。若A结果为模糊值(X或Z),则B,C都被执行,则是2驱动源,按下表输出结果,如果B,C不同,或者B,C中有x,z,则输出x。

?:

0

1

x

z

0

0

x

x

x

1

x

1

x

x

x

x

x

x

x

z

x

x

x

x

运算符的优先级

小括号优先级最高,在不清楚其它运算符优先级的情况下,可以加小括号来保证想要的表达式执行顺序。条件运算符是从右向左关联的,其它运算符都是从左向右关联的。

Verilog中运算符优先级如下表

优先级

运算符

操作数

备注

+, -, !, ~,&,~&,|,~|,^,~^,^~

一元

b=-a,b=+a,b=!a,b=~a; 红色的都是缩减运算符

**

幂运算符

*, /, %

+ -

二元

加减运算

<<, >> ,<<<, >>>

< , <=, > , >=

==, !=,===,!==

&

二元

^, ^~, ~^

二元

异或和同或

|

二元

&&

||

?:

条件运算

verilog语法实例学习(3)的更多相关文章

  1. verilog语法实例学习(4)

    Verilog模块 Verilog中代码描述的电路叫模块,模块具有以下的结构: module module_name[ (portname {, portname})]; //端口列表 [parame ...

  2. verilog语法实例学习(1)

    本文档中通过verilog实例来学习verilog语法.Verilog是一种硬件描述语言,它具有并发性和时序性.并发性是指不同硬件模块的同时操作,时序性是指信号的赋值或操作在时钟的边沿进行.由于作者本 ...

  3. verilog语法实例学习(12)

    verilog中的综合和不可综合总结 Verilog中综合的概念 综合就是EDA工具或者说综合工具把我们编写的verilog代码转化成具体电路的过程.Verilog中有很多语法,结构,过程,语句,有些 ...

  4. verilog语法实例学习(6)

    函数和任务 函数 https://wenku.baidu.com/view/d31d1ba8dd3383c4bb4cd283.html verilog中函数的目的是允许代码写成模块的方式而不是定义独立 ...

  5. verilog语法实例学习(5)

    子电路模块 子电路模块的使用 一个verilog模块能够作为一个子电路包含在另一个模块中.采用这种方式,所有的模块都必须定义在一个文件中,那么verilog编译器就必须被告知每个模块的所属.模块例化的 ...

  6. verilog语法实例学习(2)

    Verilog中的信号类型 线网类型 线网类型表示一个或多个门或者其它类型的信号源驱动的硬件连线.如果没有驱动源,则线网的默认值为z.verilog中定义的线网类型有以下几种:     wire,tr ...

  7. verilog语法实例学习(13)

    verilog代码编写指南 变量及信号命名规范  1. 系统级信号的命名.  系统级信号指复位信号,置位信号,时钟信号等需要输送到各个模块的全局信号:系统信号以字符串Sys开头.  2. 低电平有效的 ...

  8. verilog语法实例学习(11)

    同步时序电路的一般形式 时序电路由组合逻辑以及一个或多个触发器实现.一般的架构如下图所示:W为输入,Z为输出,触发器中存储的状态为Q.在时钟信号的控制下,触发器通过加在其输入端的组合逻辑输入,使得电路 ...

  9. verilog语法实例学习(10)

    常用的时序电路介绍 T触发器和JK触发器 在D触发器输入端添加一些简单的逻辑电路,可以生成另一种类型的存储元件.比如下图所示的T触发器.该电路有一个上升沿触发的触发器和两个与门,一个或门,以及一个反相 ...

  10. verilog语法实例学习(9)

    常用的时序电路介绍 寄存器 一个触发器可以存储一位数据,由n个触发器组成的电路可以存储n位数据,我们把这一组触发器叫做寄存器.寄存器中每个触发器共用同一个时钟. 下面是n位寄存器的代码,我们通过一个参 ...

随机推荐

  1. Lambda的分类(语句Lambda和表达式Lambda)

    学习自 <C#本质论> Overview 在上一文中,我们简而又简的了解了一下,匿名方法和Lambda表达式,关于匿名方法这里暂且不表,本文我们来更加详细的了解一下Lambda表达式. 本 ...

  2. 漏洞利用查询工具sandi

    漏洞利用查询工具sandi   在渗透测试中,一旦发现漏洞,就需要查找该漏洞的利用方式.由于漏洞众多,就需要渗透测试人员从海量的漏洞信息找出可用攻击载荷.Kali Linux内置了一个查询工具sand ...

  3. 1038 一元三次方程求解 2001年NOIP全国联赛提高组

    题目描述 Description 有形如:ax3+bx2+cx+d=0  这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d  均为实数),并约定该方程存在三个不同实根(根的范围在-100 ...

  4. BZOJ.1085.[SCOI2005]骑士精神(迭代加深搜索)

    题目链接 最小步数这类,适合用迭代加深搜索. 用空格走代替骑士. 搜索时记录上一步防止来回走. 不需要每次判断是否都在位置,可以计算出不在对应位置的骑士有多少个.而且每次复原一个骑士至少需要一步. 空 ...

  5. hdu 4336 概率dp

    题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率为p1,p2,````pN.每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 转移方程: ...

  6. Spring Data JPA使用keywords关键字实现CAST函数

    对不起,经过几天几夜的使用的研究得出这种方式是无法实现的,在查询上的关键字只有这些: https://docs.spring.io/spring-data/jpa/docs/2.1.x/referen ...

  7. Codeforces 235E. Number Challenge DP

    dp(a,b,c,p) = sigma ( dp(a/p^i,b/p^j,c/p^k) * ( 1+i+j+k) ) 表示用小于等于p的素数去分解的结果有多少个 E. Number Challenge ...

  8. poj1321 棋盘问题(深搜dfs)

    转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents 题目链接:id=1321">http://poj.org/prob ...

  9. Revit API创建一个拷贝房间内对象布局命令

    本课程演示创建一个拷贝房间内对象布局命令,完整演示步骤和代码.这个命令把选中房间内的对象复制到其它选中的一个或多个房间中,而且保持与源房间一致的相对位置.通过本讲座使听众知道创建一个二次开发程序很简单 ...

  10. 在busybox里使用ulimit命令

    刚才想使用ulimit修改用户进程的用户栈的大小,发现busybox里没有这个命令,上google搜索得到如下解释: "ulimit" is a shell builtin, me ...