我有一个应用程序,我以低时钟速度(clk_a)连续写入块内存,并且在这个慢时钟周期内需要以快速时钟速度(clk_b)从块内存读取三个索引以使用这些值作为数学模块中的操作数,结果在下一个慢时钟上写回块 ram。这三个索引是在慢时钟 posedge 写入的当前地址,加上两个直接相邻地址(addr_a -1 和 addr_a +1)。
什么是合成它的有效方法?迄今为止,我最好的尝试是使用一个以快速时钟速率运行的小计数器(三元组)来增加地址,但我最终用尽了逻辑,因为看起来 Yosys 没有正确推断出 ram。对此有什么好的策略?
这是我所拥有的:
module myRam2 (
input clk_a,
input clk_b,
input we_a,
input re_a,
input [10:0] addr_a,
input [10:0] addr_b,
input [11:0] din_a,
output [11:0] leftNeighbor,
output [11:0] currentX,
output [11:0] rightNeighbor
);
parameter MEM_INIT_FILE2 = "";
initial
if (MEM_INIT_FILE2 != "")
$readmemh(MEM_INIT_FILE2, ram2);
reg [11:0] ram2 [0:2047];
reg [1:0] triplet = 3;
reg [10:0] old_addr_a;
reg [11:0] temp;
always @(posedge clk_a) begin
ram2[addr_a] <= din_a;
end
always@(posedge clk_b)
if (old_addr_a != addr_a) begin
triplet <= 0;
old_addr_a <= addr_a;
end
else
if(triplet < 3) begin
triplet <= triplet +1;
end
always @(posedge clk_b) begin
temp <= ram2[addr_a + (triplet - 1)];
end
always @(posedge clk_b) begin
case(triplet)
0: leftN <= temp;
1: X <= temp;
2: rightN <= temp;
endcase
end
reg signed [11:0] leftN;
reg signed [11:0] X;
reg signed [11:0] rightN;
assign leftNeighbor = leftN;
assign currentX = X;
assign rightNeighbor = rightN;
endmodule