我试图使用以下凿子为同步读取生成内存的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时做错了什么?
答案 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块中,但我不认为合成工具需要选择你想要的同步存储器。