Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 凿子同步读存储器_Scala_Chisel - Fatal编程技术网

Scala 凿子同步读存储器

Scala 凿子同步读存储器,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

我正试图用下面的凿子为具有同步读取的内存生成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
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中被注册了,对吗?我对你的问题有点困惑,在我看来,凿子实际上生成了一个同步内存。您的合成工具是否没有正确地拾取该模式并生成适当的硬件?好的,这是有意义的。是的,我相信合成工具只需要在同一个模块中注册读取地址。