【问题标题】:SystemVerilog: Need to change 2 bits in very large arraySystemVerilog:需要在非常大的数组中更改 2 位
【发布时间】:2015-12-07 05:36:44
【问题描述】:

我有一个大小为 2400 的数组。我希望能够根据确定该位索引的组合逻辑来更新该数组中的某个位。

直接访问该位会给我一个多重驱动程序错误,因为已经为数组分配了一个初始值,并且在尝试实现状态机之后,我发现它几乎不可能,因为它需要整个数组的先前值.即:不能用变量分配范围。

logic [0:2400] big_array;
assign big_array = {ALL BITS ASSIGNED};
//Here is where I want to be able to update
logic [11:0] index;
//INDEX Determined via logic
assign big_array[index] = 1'b0;

任何帮助都会很棒!

注意:我很确定我可以通过某种类型的状态机完成此操作,因为我正在分配一个原始值,但我无法弄清楚。是否可以优先赋值?

减法是不可能的,因为数字太大了。

【问题讨论】:

  • 删除所有assign 语句。在always @(*) 中使用for 循环为所有变量赋值。只要i==indexi 是循环迭代器),就在该索引处分配1'b0
  • @sharvil111 SystemVerilog 应该使用always_comb 而不是always @(*)
  • @Greg 哦,是的,时间为零事件和增强的功能灵敏度。 always_comb 很好。谢谢。
  • @sharvil111 感谢您的帮助。我想我越来越近了。现在我有always_comb begin original = {//2400 bits here}; for(int i=0; i<2400; i++)begin if(i==index) begin big_array[i] = 1'b0; end else begin big_array[i] = original[i]; end end end 似乎它暂时记录了更改,但随后又回到原来的状态而不是停留?
  • @mruben09 是表达式original = {//2400 bits here}; 用来设置original 的初始值吗?如果是这样,则每次执行 always 块时都会设置此值。你能详细说明这部分代码吗?

标签: arrays indexing system-verilog


【解决方案1】:

我不确定这是否是您要查找的内容,但有一个 2400 位的数组(向量)。给定一个索引,我们假设您按照您所说的使用组合逻辑导出该索引,该索引处的元素将被更新。

由于您使用了 combinational 这个词,因此我提供了一个用于综合 RTL 的解决方案,并且我假设您正在尝试将该逻辑综合到硬件中。

logic [2399:0] big_array;
logic [11:0]   index;

always_comb begin
   // combinational logic here
   index = ...
end

always_ff @(posedge clk, posedge reset) begin
   if (reset) begin
      big_array = '0;    // vector fill operation
   end else begin
      big_array[index] = ...;
   end
end

我没有检查上面的代码是否有语法错误。另外,请注意,我使用了时钟进程来更新数组,但是,如果您不打算合成此代码,则可以使用其他一些触发机制。 同样,您可以使用初始语句而不是重置块。

我认为分配 big_array[index] = ... 会详细说明,但如果不是,您可以循环遍历所有索引,直到按照其他评论者的建议找到匹配项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2011-08-07
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多