verilog基础知识

1、索引

1)第一,对于变量的部分索引必须与变量声明的顺序一致(升序或者降序)
  wire [7:0] a; wire [0:7] b; wire [3:0] c; wire [0:3] d;
  assign c = a[7:4]; //正确索引 assign c = a[4:7]; //错误索引
  assign d = b[0:3]; //正确索引 assign d = b[3:0]; //错误索引
2)第二,对于变量赋同一值,两种低位和高位是不一致的
  assign a = 8’b10101100; //左边第一位为最高位,即a[7]=1;右边第一位为最低位,即a[0]=0;
  assign b = 8’b10101100; //左边第一位为最低位,即a[0]=1;右边第一位为最高位,即a[7]=0;
  wire e,f;
  assign e = a[0]; //e=0
  assign f = b[0]; //f=1
3) [3:0] [0:3]赋值
  reg [3:0] a;
  reg [0:3] b;
情况一:
  a = 4’b0111;//a[3]=0, a[2]=1, a[1]=1, a[0]=1
  b = 4’b1000;//b[0]=1, b[1]=0, b[2]=0, b[3]=0
  b = a;b[0]=0, b[1]=1, b[2]=1, b[3]=1
情况二:
  a = 4’b0111;//a[3]=0, a[2]=1, a[1]=1, a[0]=1
  b = 4’b1000;//b[0]=1, b[1]=0, b[2]=0, b[3]=0
  a = b;//a[3]=1, a[2]=0, a[1]=0, a[0]=0
推论:
  a = 4’b0111;
  b=a;
  a = b;
  结果a依旧为4’b0111,并没有反转。
4)两个索引不能同时为变量
  错误:sum <= N[ j2+3 : 2j ];
  正确:sum <=N[ j*2+3- : 3 ];
5)索引+ -,±号必须在左边,右边是位宽
  reg [31:0] big_vect; reg [0:31] little_vect;
  big_vect[0 +:8] == big_vect[7 : 0]) little_vect[0 +:8] == little_vect[0 : 7]
  big_vect[15 -:8] == big_vect[15 : 8] little_vect[15 -:8] == little_vect[8 :15]
  big_vect [0 +: 8] 从0 开始,升序,位宽为8
  little_vect [0 +: 8] 从0 开始,升序,位宽为8
  big_vect [15 -: 8] 从15开始,降序,位宽为8
  little_vect [15 -: 8] 从15开始,降序,位宽为8

2、归约

归约操作符包括:
  归约与(&),归约与非(&),归约或(|),归约或非(|),归约异或(),归约同或(~)。
归约操作符结果:
  归约操作符只有一个操作数,它对这个向量操作数逐位进行操作,最终产生一个 1bit 结果。
例子:
  A = 4’b1010 ;
  &A ; //结果为 1 & 0 & 1 & 0 = 1’b0,可用来判断变量A是否全1
  ~|A ; //结果为 ~(1 | 0 | 1 | 0) = 1’b0, 可用来判断变量A是否为全0
  ^A ; //结果为 1 ^ 0 ^ 1 ^ 0 = 1’b0

3、拼接

  reg a, b, c, d, e;
  wire [24:0] top, bottom;
  assign top = { {5{a}}, {5{b}}, {5{c}}, {5{d}}, {5{e}} };
  assign bottom = {5{a,b,c,d,e}};

4、二维数组、三维数组

  reg [7:0] mem2 [0:3]; // 8-bit wide vector array with depth(也即数组元素个数)=4
  reg [15:0] mem3 [0:3][0:1]; // 16-bit wide vector 2D array with rows(行)=4,cols(列)=2

5、always语句中可以用for语句,always外面用for语句则要结合generate

6、casex 和 casez语句

  1)在case语句中,敏感表达式中与各项值之间的比较是一种全等比较,每一位都相同才认为匹配。
  2)在casez语句中,如果分支表达式某些位的值为高阻z,那么对这些位的比较就会忽略,不予考虑,而只关注其他位的比较结果。
  3)在casex语句中,则把这种处理方式进一步扩展到对x的处理,即如果比较双方有一方的某些位的值是z或x,那么这些位的比较就不予考虑。
在这里插入图片描述

7、task和function语句

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8、常数前面是否要加位宽

  参与运算、赋值、比较的常数前面应加上位宽,不然会被综合成32位的。
  其他的不用加位宽,如temp[7:0]里的7和0就不用加位宽,b=a<<4中的4。

9、参与运算、赋值、比较的变量的位宽可以不一致

  a+b
  a<=b
  if(a>b)
  a、b位宽可以不一致,编译器会自动补齐

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值