本文主要是介绍systemverilog中位的选择,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
常用的变量类型就是 reg 和 wire ,这两种类型可以定义 一位的变量,也可以定义多位,其中 1 bit 的变量称为 标量(scalar),多 bit 的变量称为 向量(vector),如下所示:
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
向量的多 bit 范围为我们提供了对其中若干 bit 寻址的能力,向量中的最高位称为 msb ,而最低位称为 lsb,如下:
wire [msb:lsb] name;
integer my_msb;wire [15:0] priority; // msb = 15, lsb = 0
wire [my_msb: 2] prior; // illegal
不管是定义 wire 还是 reg 类型,其 msb 和 lsb 都必须是常量表达式,而不能是变量!!如上面的定义 prior 时其 msb 为变量,这种情况是非法非!!
注:msb以及lsb可以是任何整数值–正负或零,而且Isb的值可以大于、等于或小于msb的值。但为了保持风格统一,也就是左边的值要比右边的值大,所以不建议lsb大于或等于msb
位选择
向量中的任意位都能被单独选择,并且可以进行单独赋值,如下:
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
当然也能进行连续多个 bit 的选择以及赋值:
eg [31:0] addr;addr [23:16] = 8'h23; // bits 23 to 16 will be replaced by the new value 'h23 -> constant part-select
上面的位选择采用的是以常量表达式作为索引值,其实 verilog 支持起始值为变量的位选择,如下:
[<start_bit> +: <width>] // part-select increments from start-bit
[<start_bit> -: <width>] // part-select decrements from start-bit
拥有一个可变的部分选择,可以在循环中有效地使用它来选择矢量的部分。虽然起始位可以改变,但宽度必须是恒定的,看下面例子
module des;reg [31:0] data;int i;initial begindata = 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]);endendmodule
结果如下
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.
这篇关于systemverilog中位的选择的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!