verilog向量位的选择

verilog 向量位的选择

在Verilog中,经常需要使用到寄存器或者线网向量的某一位或者某几位。对于向量位的选择,通常使用如下方法:

reg [7:0]  data; //定义一个8位的reg型变量
//always block
x1=data[7]; //将8位reg型向量的最高位赋值给x1
x1=data[3:0]; //将8位reg型变量的低四位赋值给x2

此处,对向量的定义如下

vect [msb_expr:lsb_expr];
//msb_expr和lsb_expr必须为常量表达式。

正因为msb_expr和lsb_expr必须为常量,所以导致某些时候不方便,比如在移位或者使用for循环初始化。
除了用常量指定向量位选择外,还有另一种方法

reg [15:0] big_vect;
reg [0:15] little_vect;
// big_vect[lsb_base_expr +: width_expr];
// little_vect[msb_base_expr +: width_expr];

// big_vect[msb_base_expr -: width_expr];
// little_vect[lsb_base_expr -: width_expr];

在上面的定义中,lsb_base_expr和msb_base_expr可以是变量,width_expr必须是常量表达式
例如,定义 reg [31:0] big_vect
那么
big_vect[0 +:8]和big_vect [7:0]是等价的
big_vect[15 -:8]和big_vect[15:8]是等价的。
同理,定义reg [0:31] little_vect
那么
little_vect[0 +:8]和little[0:7]是等价的
little_vect[15 -:8]和little[8:15]是等价的
下面代码是vivado例子工程wave_gen中的testbench文件tb_cmd_gen.v中一小段

  function [0:5*8-1] to_dec_str; //to_dec_str按照上文中littel_vect方式定义
    input [DATA_WID-1:0] val;
    integer i;
  begin
    $sformat(to_dec_str,"%d",val);
    for (i=0; i<=4; i=i+1)
      if (to_dec_str[8*i+:8] == " ")  //注意,此处i为变量
        to_dec_str[8*i+:8] = "0";
  end
  endfunction

上面代码中,使用循环判断
to_dec_str[0:7]、to_dec_str[8:15]、 to_dec_str[16:23]、 to_dec_str[24:31]、 to_dec_str[32:39]是否为空。如果用第一种向量位选择的方式,是无法用循环实现的。

1《IEEE Std 1364-2001》
2《Verilog HDL数字设计与综合》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值