【发布时间】: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==index(i是循环迭代器),就在该索引处分配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