我正在尝试在我的设计中调试一个非常奇怪的行为。我正在调试以下 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在这两种情况下的行为都符合预期,这意味着它恰好在我预期的时候到达。但是由于某种原因,以下行的行为有所不同:
sh_in[0] <= x_in;
在我单独测试ff_array的情况下, x_in值恰好在时钟的同一个 pos 边缘移入sh_in[0] ,但是,当我在从 RAM 读取x_in的更大设计中使用它时, x_in被移位到sh_in[0]一个时钟周期后,而不是在同一个时钟上。我真的不知道原因。我正在使用 xsim v2018.2(64 位)。