仿真中数组移位器的不同行为
Different Behavior of an Array Shifter in Simulation
我正在尝试调试我设计中的一个非常奇怪的行为。我正在调试以下 Systemverilog 代码:
module ff_array
#(
parameter INPUT_WIDTH = 16,
parameter OUTPUT_WIDTH = INPUT_WIDTH*2,
parameter ARRAY_SIZE = 3
)
(
input logic clk,
input logic rst,
input logic signed [INPUT_WIDTH-1 : 0 ]x_in,
output logic signed [OUTPUT_WIDTH-1 : 0 ]y_out
);
logic signed [INPUT_WIDTH-1 : 0 ] sh_in [ARRAY_SIZE-1:0];
always_ff @(posedge clk) begin
if(~rst) begin
for (int i=0; i< ARRAY_SIZE; i++) begin
sh_in[i] <= {OUTPUT_WIDTH{1'b0}};
end
end else begin
sh_in[0] <= x_in;
for (int i=1; i< ARRAY_SIZE; i++) begin
sh_in[i] <= sh_in[i-1];
end
end
end
assign y_out = sh_in[ARRAY_SIZE-1];
endmodule
上面的代码是更大设计的一部分,但由于我将错误缩小到上面的电路,所以我没有添加整个设计。我对上述代码的预期行为是输入延迟 ARRAY_SIZE-1 次。我有一个简单的测试台,用于验证通过的预期行为。当我在更大的设计中使用这个模块时,问题就开始了。一般来说,唯一的区别是 x_in 是从 RAM 中读取的。当我比较两个波形时(一个是当上面的代码是 DUT 时,另一个是当我在更大的设计中使用它时)我看到 x_in 在两个cases 的行为符合预期,也就是说,它正好在我预期的时候到达。但是由于某种原因,以下行的行为有所不同:
sh_in[0] <= x_in;
在我单独测试 ff_array 的情况下,x_in 值变为 sh_in[0] 正好在时钟的同一个 pos 边缘,但是,当我在更大的设计中使用它时,其中 x_in从RAM中读取,x_in被移到sh_in[0]一个时钟周期after 并且不在同一个时钟上。我真的不知道原因。我正在使用 xsim v2018.2(64 位)。
您的问题不在于 ff_array
,而在于 RAM 的输出或互连。查看简单的波形对您没有帮助,因为它们不会显示 "delta" 延迟,它们只会向您显示它们在时间步长处的最终值。您需要显示产生 RAM 输出的代码。如果它的结构类似于您的 always_ff
块,那么人们会期望它在一个时钟周期后出现。
我正在尝试调试我设计中的一个非常奇怪的行为。我正在调试以下 Systemverilog 代码:
module ff_array
#(
parameter INPUT_WIDTH = 16,
parameter OUTPUT_WIDTH = INPUT_WIDTH*2,
parameter ARRAY_SIZE = 3
)
(
input logic clk,
input logic rst,
input logic signed [INPUT_WIDTH-1 : 0 ]x_in,
output logic signed [OUTPUT_WIDTH-1 : 0 ]y_out
);
logic signed [INPUT_WIDTH-1 : 0 ] sh_in [ARRAY_SIZE-1:0];
always_ff @(posedge clk) begin
if(~rst) begin
for (int i=0; i< ARRAY_SIZE; i++) begin
sh_in[i] <= {OUTPUT_WIDTH{1'b0}};
end
end else begin
sh_in[0] <= x_in;
for (int i=1; i< ARRAY_SIZE; i++) begin
sh_in[i] <= sh_in[i-1];
end
end
end
assign y_out = sh_in[ARRAY_SIZE-1];
endmodule
上面的代码是更大设计的一部分,但由于我将错误缩小到上面的电路,所以我没有添加整个设计。我对上述代码的预期行为是输入延迟 ARRAY_SIZE-1 次。我有一个简单的测试台,用于验证通过的预期行为。当我在更大的设计中使用这个模块时,问题就开始了。一般来说,唯一的区别是 x_in 是从 RAM 中读取的。当我比较两个波形时(一个是当上面的代码是 DUT 时,另一个是当我在更大的设计中使用它时)我看到 x_in 在两个cases 的行为符合预期,也就是说,它正好在我预期的时候到达。但是由于某种原因,以下行的行为有所不同:
sh_in[0] <= x_in;
在我单独测试 ff_array 的情况下,x_in 值变为 sh_in[0] 正好在时钟的同一个 pos 边缘,但是,当我在更大的设计中使用它时,其中 x_in从RAM中读取,x_in被移到sh_in[0]一个时钟周期after 并且不在同一个时钟上。我真的不知道原因。我正在使用 xsim v2018.2(64 位)。
您的问题不在于 ff_array
,而在于 RAM 的输出或互连。查看简单的波形对您没有帮助,因为它们不会显示 "delta" 延迟,它们只会向您显示它们在时间步长处的最终值。您需要显示产生 RAM 输出的代码。如果它的结构类似于您的 always_ff
块,那么人们会期望它在一个时钟周期后出现。