1

我正在尝试使用以下凿子为具有同步读取的内存生成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,我做错了什么?

4

1 回答 1

3

Chisel 手册指出创建同步存储器的正确方法是注册地址,而不是读取数据。虽然有点不直观,但通过寄存器重新定时,它在概念上是一样的。

 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 块中,但我认为综合工具不需要同步内存来获取您想要的同步内存。

于 2014-06-23T12:14:43.810 回答