1

我在 Verilog 中使用这个电汇声明:

wire [23:15] myvar;

我的代码有效,并且我以前见过这种编码风格,但我不确定实际发生了什么,我只能猜测正在声明一条 9 位宽的线。这就是正在发生的事情吗?我想在网上阅读更多内容,但我不知道这叫什么,所以对这个简单化的问题表示歉意。

4

2 回答 2

4

Verilog 是一种硬件描述语言 (HDL)。无论您编写/声明什么,最终都会成为一种硬件形式。

让我们看一下下面的图片:

导线索引

在这里,声明wire [23:15] myvar;wire [8:0] myvar;声明相同的线束,九位宽。它只是不同的索引部分。不管你称它为a[0](when ais wire [8:0] a) 还是a[15](when ais wire [23:15] a)。编码部分根据程序员的难易程度有所不同,而综合部分保持不变

另外,请注意,在前一种情况下,myvar[15]是最低有效位,而后者作为myvar[0]LSB。我们可以交换声明部分,这也将交换 MSB-LSB。

reg  [7:0] reg1;    // 8-bit vector with MSB=7 LSB=0
reg  [0:7] reg2;    // 8-bit vector with MSB=0 LSB=7
// ...
// ...
reg1 = 8'hF0; // reg1[7] = 1 and reg1[0] = 0 ultimately, reg1 = F0
reg2 = 8'hF0; // reg2[7] = 0 and reg2[0] = 1 ultimately, reg2 = F0

举个例子:

wire [23:15] myvar;
reg [23:15] reg2;
reg [31:0] reg3;
initial begin
    $monitor("myvar = %0h myvar2 = %0h reg3 = %0h",myvar,myvar2,reg3);
    reg3 = 32'h5ABC_FEDC;

// This will correctly assign values to reg2, since it is [23:15]
    for(int i=16;i<20;i++)
      begin
      reg2[i] = myvar[i];
        $display("1: reg2[%0d] = %0h myvar[%0d] = %0h",i,reg2[i],i,myvar[i]);
      end

// While, this will not assign correctly, 
// since reg2 does not have [5:0] indexes,neither does myvar
    for(int i=0;i<5;i++)
      begin
      reg2[i] = myvar[i];
        $display("2: reg2[%0d] = %0h myvar[%0d] = %0h",i,reg2[i],i,myvar[i]);
      end
  end

另一种选择是你的regis [8:0]while wireis [23:0]。这所有重要的事情,但只是在编码部分。请注意,在下面的第一个片段中,值被分配给reg1[4:0]并且在第二个片段中,它在 range 中reg1[20:15]

reg [8:0] reg1;
wire [23:15] myvar;
// Correct, since LSB of myvar is at index position 15
    for(int i=0;i<5;i++)
      begin
        reg1[i] = myvar[i+15];
        $display("3 : reg1[%0d] = %0h myvar[%0d] = %0h",i,reg1[i],i,myvar[i+15]);
      end

reg [31:0] reg1;
wire [23:15] myvar;
// reg1[19:15] is assigned here
for(int i=15;i<20;i++)
      begin
        reg1[i] = myvar[i];
        $display("4 : reg1[%0d] = %0h myvar[%0d] = %0h",i,reg1[i],i,myvar[i]);
      end

所以,最后,从电线驱动时,只有一些切片不同,对实际硬件没有影响。可以从Verilog 语法详细信息链接获得更多信息。

于 2015-11-15T03:27:11.763 回答
2

你是正确的,你正在声明一个 9 位线。许多设计对于 LSB 和 MSB 值应该是什么,索引编号应该进入哪个方向有不同的想法。在开始引用单个位或片之前,索引值的用途并不重要。

于 2015-11-15T03:14:20.210 回答