risc-v中文社区

 找回密码
 立即注册
查看: 1116|回复: 1

[原创] chisel双端口缓冲区

[复制链接]

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
发表于 2021-9-16 14:46:27 | 显示全部楼层 |阅读模式
import chisel3._

/**
  * 双端口 256字节长度 8bit位宽的内存缓冲区
  */
class Memo extends Module{
  val io = IO(new Bundle {
    val wen    =      Input(Bool())
    val wrAddr =      Input(UInt(8.W))
    val wrData =      Input(UInt(8.W))
    val ren    =      Input(Bool())
    val rdAddr =      Input(UInt(8.W))
    val rdData =      Output(UInt(8.W))
  })
  val mem = Mem(256,UInt(8.W)) //256数量,UInt(8.W) chisel类型数据
  //写
  when(io.wen) {
    mem(io.wrAddr) := io.wrData
  }
  //读
  io.rdData := 0.U //输出必须要有一个默认值
  when(io.ren) {
    io.rdData := mem(io.rdAddr)
  }
}

回复

使用道具 举报

347

主题

564

帖子

2237

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2237
 楼主| 发表于 2021-9-16 14:49:09 | 显示全部楼层
生成的verilog代码如下:
module DBram(
  input        clock,
  input        reset,
  input        io_wen,
  input  [7:0] io_wrAddr,
  input  [7:0] io_wrData,
  input        io_ren,
  input  [7:0] io_rdAddr,
  output [7:0] io_rdData
);
  reg [7:0] mem [0:255]; // @[DBram.scala 17:16]
  reg [31:0] _RAND_0;
  wire [7:0] mem__T_1_data; // @[DBram.scala 17:16]
  wire [7:0] mem__T_1_addr; // @[DBram.scala 17:16]
  wire [7:0] mem__T_data; // @[DBram.scala 17:16]
  wire [7:0] mem__T_addr; // @[DBram.scala 17:16]
  wire  mem__T_mask; // @[DBram.scala 17:16]
  wire  mem__T_en; // @[DBram.scala 17:16]
  assign mem__T_1_addr = io_rdAddr;
  assign mem__T_1_data = mem[mem__T_1_addr]; // @[DBram.scala 17:16]
  assign mem__T_data = io_wrData;
  assign mem__T_addr = io_wrAddr;
  assign mem__T_mask = 1'h1;
  assign mem__T_en = io_wen;
  assign io_rdData = io_ren ? mem__T_1_data : 8'h0; // @[DBram.scala 23:13 DBram.scala 25:15]
`ifdef RANDOMIZE_GARBAGE_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_INVALID_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_REG_INIT
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_MEM_INIT
`define RANDOMIZE
`endif
`ifndef RANDOM
`define RANDOM $random
`endif
`ifdef RANDOMIZE_MEM_INIT
  integer initvar;
`endif
`ifndef SYNTHESIS
initial begin
  `ifdef RANDOMIZE
    `ifdef INIT_RANDOM
      `INIT_RANDOM
    `endif
    `ifndef VERILATOR
      `ifdef RANDOMIZE_DELAY
        #`RANDOMIZE_DELAY begin end
      `else
        #0.002 begin end
      `endif
    `endif
  _RAND_0 = {1{`RANDOM}};
  `ifdef RANDOMIZE_MEM_INIT
  for (initvar = 0; initvar < 256; initvar = initvar+1)
    mem[initvar] = _RAND_0[7:0];
  `endif // RANDOMIZE_MEM_INIT
  `endif // RANDOMIZE
end // initial
`endif // SYNTHESIS
  always @(posedge clock) begin
    if(mem__T_en & mem__T_mask) begin
      mem[mem__T_addr] <= mem__T_data; // @[DBram.scala 17:16]
    end
  end
endmodule
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



Archiver|手机版|小黑屋|risc-v中文社区

GMT+8, 2024-5-3 09:06 , Processed in 0.021363 second(s), 17 queries .

risc-v中文社区论坛 官方网站

Copyright © 2018-2021, risc-v open source

快速回复 返回顶部 返回列表