凿同步读存储器

时间:2014-06-21 09:35:08

标签: scala chisel

我试图使用以下凿子为同步读取生成内存的verilog

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

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

我在做凿子以生成在always块内读取内存的verilog时做错了什么?

1 个答案:

答案 0 :(得分:2)

Chisel手册说明创建同步存储器的正确方法是注册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块中,但我不认为合成工具需要选择你想要的同步存储器。