在verilog中进行位切片

时间:2017-01-05 11:43:40

标签: programming-languages verilog modelsim

如何编写wdata [((8 * j)+7):( 8 * i)] = $ random;用verilog编程语言? ,其中i和j是reg类型变量。 Modelsim给出了恒定范围变量的误差。我怎么能以适当的方式写它。

2 个答案:

答案 0 :(得分:2)

您应该从硬件角度考虑解决方案。

这是一个解决方案。希望它会对你有所帮助。

module temp(clk);
  input clk;
  reg i, j;
  reg [23:0] register, select;
  wire [23:0] temp;

  initial 
  begin
      i = 'd1;
      j = 'd1;
  end

  generate
  for(genvar i = 0; i<24; i++)
  begin
      assign temp[i] = select[i] ? $random : register[i]; 
  end
  endgenerate

  always @ (posedge clk)
  begin
      register <= temp;
  end

  always @ *
  begin
      select = (32'hffff_ffff << ((j<<3)+8)) ^ (32'hffff_ffff << (i<<3));
  end
endmodule

答案 1 :(得分:0)

使用数组切片构造。您可以在Array slicing Q&A

找到更详细的说明
bit [7:0] PA, PB;
int loc;

initial begin
  loc = 3;
  PA = PB;                      // Read/Write
  PA[7:4] = 'hA;                // Read/Write of a slice
  PA[loc -:4] = PA[loc+1 +:4];  // Read/Write of a variable slice equivalent to PA[3:0] = PA[7:4];
end

Verilog 2001语法

[M -: N]  // negative offset from bit index M, N bit result 
[M +: N]  // positive offset from bit index M, N bit result