【发布时间】:2020-05-17 11:53:43
【问题描述】:
我认为这个问题最好用一个例子来理解。所以我们开始:
想象一下定义如下:
parameter number_of_points_before_point_of_interest = 4;
logic [15:0] test_data = 16'b0000111100001111;
logic [3: 0] point_of_interest;
logic [7: 0] output_data;
如果分配给 point_of_interest 的值为 1,而 number_of_points_before_point_of_interest 的值为 4。我希望我的 output_data 为 {test_data[E: F], test_data[5:0]} 或 8'b00111100。
所以本质上,我想取 8 位,从 (point_of_interest - number_of_points_before_point_of_interest) 开始,到 (point_of_interest) 结束 - number_of_points_before_point_of_interest + 7)。
由于point_of_interest为可变数,以下两种索引方式无效:
为了让代码更简洁:point_of_interest --> pot
number_of_points_before_point_of_interest --> num_pt_before_pot
buffer[pot - num_pt_before_pot: 4'hF] // Invalid since pot not constant
buffer[pot -: num_pt_before_pot] // Part-select doesn't work either
注意:在第二种情况下,底池的可变性不是问题,因为起点可以是可变的。无论如何,part-select 在这个例子中并没有提供理想的结果。
非常感谢您的帮助。提前致谢
【问题讨论】:
-
在第二种情况下,'num_pt_before_port' 必须是一个常量。 'pot' 可以是一个变量。
-
是的,没错。但是,当您想要环绕缓冲区时,部分选择不起作用。我将进行编辑以表明这一点。
-
在系统verilog中,部件选择的宽度必须是常量。 (硬件中没有可变尺寸的线束)。如果不能使其成为常数,则不能使用此部件选择。尝试使用单个元素(宽度 == 1)的不同方法。
标签: verilog system-verilog circular-buffer