Scala 凿子同步读存储器
我正试图用下面的凿子为具有同步读取的内存生成verilogScala 凿子同步读存储器,scala,chisel,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
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
wire[63:0]T1;
reg[63:0]读取数据;
分配T1=my_mem[io_addr];
始终@(posedge clk)开始
如果(重新)开始
读取数据凿子手册说明创建同步存储器的正确方法是注册地址,而不是读取数据。虽然寄存器重新计时稍微不直观,但概念上是一样的
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
分配io_out=T0;
分配T0=我的记忆[reg\u raddr];
始终@(posedge clk)开始
如果(重新)开始
reg_raddr的读取不是已经在always块中了吗?内存的读取是assign语句,然后它就在read_data flop中被注册了,对吗?我对你的问题有点困惑,在我看来,凿子实际上生成了一个同步内存。您的合成工具是否没有正确地拾取该模式并生成适当的硬件?好的,这是有意义的。是的,我相信合成工具只需要在同一个模块中注册读取地址。