Verilog 循环缓冲区:选择包含环绕点的索引范围

Verilog 循环缓冲区:选择包含环绕点的索引范围,verilog,system-verilog,circular-buffer,Verilog,System Verilog,Circular Buffer,我认为最好用一个例子来理解这个问题。现在我们开始: 假设定义了以下内容: 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; 如果指定给感兴趣的点的值为1,而在感兴趣的点之前的点的数量为4。我希望我的输出数据是{test_d

我认为最好用一个例子来理解这个问题。现在我们开始:

假设定义了以下内容:

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;
如果指定给感兴趣的点的值为1,而在感兴趣的点之前的点的数量为4。我希望我的输出数据是{test_data[E:F],test_data[5:0]}或8'b00111100

本质上,我想取8位,从感兴趣点开始,在感兴趣点之前,从感兴趣点的数量开始,到感兴趣点结束 -兴趣点之前的兴趣点数量+7

由于感兴趣的点是一个可变数字,以下两种索引方法无效:

为了使代码更简洁:兴趣点->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 
注:在第二种情况下,pot的可变性不是问题,因为起点可以是可变的。无论如何,在本例中,“零件选择”并不能提供理想的结果


非常感谢你的帮助。提前感谢

一个简单的技巧就是复制测试数据,然后从中获取一部分

  output_data   = {2{test_data}}[16+pot-before_pot-:2*before_pot];

在第二种情况下,“num_pt_before_port”必须是常量“pot”可以是一个变量。是的,这是真的。但是,要环绕缓冲区时,“零件选择”不起作用。我将进行编辑以表明这一点。在system verilog中,选择的零件宽度必须是常量。硬件中没有可变尺寸的线束。如果不能将其设置为常量,则不能使用此零件选择。尝试使用单个元素宽度==1的其他方法。