Verilog scalar and vectorVerilog标量和向量

Verilog需要表示单独的位以及一组位。例如,单个位顺序元素是触发器。然而,一个16位连续元素是一个可以容纳16位的寄存器。为此,Verilog具有标量scalar和向量vector网络以及变量。

标量和向量

没有范围说明的net或reg声明被认为是1位宽,是一个标量。如果指定了范围,则net或reg成为称为向量的多位实体。
在这里插入图片描述

wire       o_nor;           // single bit scalar net
  wire [7:0]  o_flop;          // 8-bit vector net
  reg         parity;          // single bit scalar variable
  reg  [31:0] addr;            // 32 bit vector variable to store address
 

该范围使您能够寻址向量中的各个位。 应将向量的最高有效位指定为该范围内的左手值,而应将向量的最低有效位指定在右侧。


  wire  [msb:lsb]   name;
  integer           my_msb;
 
  wire [15:0]        priority;      // msb = 15, lsb = 0
  wire [my_msb: 2]   prior;         // 非法
 

在上面的示例中,将创建一个称为优先级的16位宽的网络。 请注意,msb和lsb应该是一个常量表达式,不能用变量代替。 但它们可以是任何整数值-正,负或零; 并且lsb值可以大于,等于或小于msb值。

位选择

向量变量中的任何位都可以单独选择并分配一个新值,如下所示。这称为位选择。如果位选择超出范围或位选择是x或z,则返回的值将是x。
在这里插入图片描述

reg [7:0]      addr;         // 8-bit reg variable [7, 6, 5, 4, 3, 2, 1, 0]
 
  addr [0] = 1;                // assign 1 to bit 0 of addr
  addr [3] = 0;                // assign 0 to bit 3 of addr
  addr [8] = 1;                //非法:addr中不存在bit8

部分选取

在这里插入图片描述
可以选择一定范围的连续位,这称为部分选择。有两种类型的部分选择,一种具有恒定的部分选择,另一种具有索引的部分选择。

reg [31:0]    addr;
 
  addr [23:16] = 8'h23;         // 第23至16位将被新值'h23赋值->恒定部分选择

具有可变的部分选择,使其可以有效地在循环中用于选择向量的部分。尽管起始位可以改变,但是宽度必须恒定。

[<start_bit> +: <width>]     // 部分选择从起始点开始递曾
[<start_bit> -: <width>]     // 部分选择从起始点开始递减
module des;
  reg [31:0]  data;
  int         i;
 
  initial begin
    data = 32'hFACE_CAFE;
    for (i = 0; i < 4; i++) begin
      $display ("data[8*%0d +: 8] = 0x%0h", i, data[8*i +: 8]);
    end
 
    $display ("data[7:0]   = 0x%0h", data[7:0]);
    $display ("data[15:8]  = 0x%0h", data[15:8]);
    $display ("data[23:16] = 0x%0h", data[23:16]);
    $display ("data[31:24] = 0x%0h", data[31:24]);
  end
 
endmodule
 
Simulation Log
ncsim> run
data[8*0 +: 8] = 0xfe              // ~ data [8*0+8 : 8*0]
data[8*1 +: 8] = 0xca              // ~ data [8*1+8 : 8*1]
data[8*2 +: 8] = 0xce              // ~ data [8*2+8 : 8*2]
data[8*3 +: 8] = 0xfa              // ~ data [8*3+8 : 8*3]

data[7:0]   = 0xfe
data[15:8]  = 0xca
data[23:16] = 0xce
data[31:24] = 0xfa
ncsim: *W,RNQUIE: Simulation is complete.

常见错误

module tb;
   reg [15:0]    data;
 
   initial begin
      $display ("data[0:9] = 0x%0h", data[0:9]);   // 错误:部分选择索引表达式的顺序相反,应该是【9:0】
   end
endmodule

参考文献:
【1】https://www.chipverify.com/verilog/verilog-scalar-vector

发布了124 篇原创文章 · 获赞 8 · 访问量 6688

猜你喜欢

转载自blog.csdn.net/qq_43042339/article/details/104549926