2014-06-21 61 views
1

我试图生成与下面凿凿同步读取内存

val my_mem = Mem(Bits(width=64), 4096, seqRead=true) 
val read_data = Reg(Bits(width=64)) 
when(io.re) { 
read_data := my_mem(io.addr) 
} 
io.ret_data := read_data 

但是同步读取的存储Verilog的,这产生的Verilog与此

wire[63:0] T1; 
reg [63:0] read_data; 
assign T1 = my_mem[io_addr]; 

always @(posedge clk) begin 
if(io_re) begin 
    read_data <= T1; 
end 

我是什么做凿子产生的verilog有永久块内的内存读取错误?

+0

是不是已经在always块内读取了? – Kamyar

+0

内存的读取是赋值语句,然后它只是在read_data翻牌中注册,对吧? – Austin

+0

我对你的问题有些困惑,似乎在我看来,凿子确实产生了同步记忆。你的综合工具没有适当地选择这种模式并生成适当的硬件? – Chris

回答

2

凿子手册说明创建同步存储器的正确方法是注册ADDRESS,而不是读取数据。虽然有点不直观,但是在重新计时的情况下,这在概念上是一回事。

val my_mem = Mem(Bits(width=64), 4096, seqRead=true) 
val reg_raddr = Reg(UInt()) 
val rdata  = my_mem(reg_raddr) 
when (io.re) { reg_raddr := io.addr } 

产生这样的:

assign io_out = T0; 
assign T0 = my_mem[reg_raddr]; 

always @(posedge clk) begin 
    if(io_re) begin 
    reg_raddr <= io_addr; 
    end 
end 

读到的数据是不是在always块,但我不认为这是必要的综合工具拿起您要同步存储器。

+1

好吧,这是有道理的。您的权利,我相信综合工具只要求读取地址在同一模块内注册。 – Austin