aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/stanza/chirrtl.stanza7
-rw-r--r--test/passes/to-verilog/rdwr-mem.fir61
-rw-r--r--test/passes/to-verilog/wr-mem.fir40
3 files changed, 75 insertions, 33 deletions
diff --git a/src/main/stanza/chirrtl.stanza b/src/main/stanza/chirrtl.stanza
index f9971323..59f6e359 100644
--- a/src/main/stanza/chirrtl.stanza
+++ b/src/main/stanza/chirrtl.stanza
@@ -163,12 +163,19 @@ defn infer-mdir (c:Circuit) -> Circuit :
[MInfer,MInfer] : error("Shouldn't be here")
[MInfer,MWrite] : MWrite
[MInfer,MRead] : MRead
+ [MInfer,MReadWrite] : MReadWrite
[MWrite,MInfer] : error("Shouldn't be here")
[MWrite,MWrite] : MWrite
[MWrite,MRead] : MReadWrite
+ [MWrite,MReadWrite] : MReadWrite
[MRead,MInfer] : error("Shouldn't be here")
[MRead,MWrite] : MReadWrite
[MRead,MRead] : MRead
+ [MRead,MReadWrite] : MReadWrite
+ [MReadWrite,MInfer] : error("Shouldn't be here")
+ [MReadWrite,MWrite] : MReadWrite
+ [MReadWrite,MRead] : MReadWrite
+ [MReadWrite,MReadWrite] : MReadWrite
mports[name(e)] = new_mport_dir
e
(e) : e
diff --git a/test/passes/to-verilog/rdwr-mem.fir b/test/passes/to-verilog/rdwr-mem.fir
index d056ecf6..e382b3b5 100644
--- a/test/passes/to-verilog/rdwr-mem.fir
+++ b/test/passes/to-verilog/rdwr-mem.fir
@@ -9,8 +9,9 @@ circuit top :
input wen : UInt<1>
input clk : Clock
- smem m : UInt<32>[4],clk
- rdwr accessor c = m[index]
+ smem m : UInt<32>[4]
+ infer mport c = m[index],clk
+ rdata is invalid
when ren :
rdata <= c
when wen :
@@ -18,30 +19,50 @@ circuit top :
; CHECK: module top(
-; CHECK: output [31:0] rdata,
-; CHECK: input [1:0] index,
-; CHECK: input [0:0] ren,
-; CHECK: input [0:0] clk
+; CHECK: output [31:0] rdata,
+; CHECK: input [31:0] wdata,
+; CHECK: input [1:0] index,
+; CHECK: input ren,
+; CHECK: input wen,
+; CHECK: input clk
; CHECK: );
-; CHECK: wire [31:0] c;
-; CHECK: reg [31:0] m [0:3];
-; CHECK: reg [1:0] index_1;
+; CHECK: reg [31:0] m [0:3];
+; CHECK: wire [31:0] m_c_rdata;
+; CHECK: wire [1:0] m_c_raddr;
+; CHECK: wire m_c_ren;
+; CHECK: wire [31:0] m_c_wdata;
+; CHECK: wire [1:0] m_c_waddr;
+; CHECK: wire m_c_wmask;
+; CHECK: wire m_c_wen;
+; CHECK: wire m_c_clk;
+; CHECK: reg [1:0] GEN_2;
+; CHECK: reg GEN_3;
+; CHECK: reg [1:0] GEN_0;
+; CHECK: reg [31:0] GEN_1;
+; CHECK: assign rdata = m_c_rdata;
+; CHECK: assign m_c_clk = clk;
+; CHECK: assign m_c_raddr = index;
+; CHECK: assign m_c_ren = 1'h1;
+; CHECK: assign m_c_rdata = m[GEN_2];
+; CHECK: assign m_c_wdata = wen ? wdata : GEN_1;
+; CHECK: assign m_c_waddr = index;
+; CHECK: assign m_c_wmask = wen ? 1'h1 : 1'h0;
+; CHECK: assign m_c_wen = 1'h1;
; CHECK: `ifndef SYNTHESIS
; CHECK: integer initvar;
; CHECK: initial begin
; CHECK: #0.002;
-; CHECK: for (initvar = 0; initvar < 4; initvar = initvar+1)
+; CHECK: for (initvar = 0; initvar < 4; initvar = initvar+1)
; CHECK: m[initvar] = {1{$random}};
-; CHECK: index_1 = {1{$random}};
+; CHECK: GEN_0 = {1{$random}};
+; CHECK: GEN_1 = {1{$random}};
; CHECK: end
; CHECK: `endif
-; CHECK: assign rdata = m[index_1];
-; CHECK: always @(posedge clk) begin
-; CHECK: if(ren) begin
-; CHECK: index_1 <= index;
-; CHECK: end else if(wen) begin
-; CHECK: m[index] <= wdata;
-; CHECK: end
-; CHECK: end
+; CHECK: always @(posedge m_c_clk) begin
+; CHECK: GEN_2 <= m_c_raddr;
+; CHECK: GEN_3 <= m_c_ren;
+; CHECK: if(m_c_wen & m_c_wmask) begin
+; CHECK: m[m_c_waddr] <= m_c_wdata;
+; CHECK: end
+; CHECK: end
; CHECK: endmodule
-
diff --git a/test/passes/to-verilog/wr-mem.fir b/test/passes/to-verilog/wr-mem.fir
index b21491aa..06745812 100644
--- a/test/passes/to-verilog/wr-mem.fir
+++ b/test/passes/to-verilog/wr-mem.fir
@@ -7,30 +7,44 @@ circuit top :
input wen : UInt<1>
input clk : Clock
- smem m : UInt<32>[4],clk
- write accessor c = m[index]
+ smem m : UInt<32>[4]
+ write mport c = m[index],clk
when wen :
c <= wdata
; CHECK: module top(
-; CHECK: input [31:0] wdata,
-; CHECK: input [1:0] index,
-; CHECK: input [0:0] wen,
-; CHECK: input [0:0] clk
+; CHECK: input [31:0] wdata,
+; CHECK: input [1:0] index,
+; CHECK: input wen,
+; CHECK: input clk
; CHECK: );
-; CHECK: reg [31:0] m [0:3];
+; CHECK: reg [31:0] m [0:3];
+; CHECK: wire [31:0] m_c_data;
+; CHECK: wire [1:0] m_c_addr;
+; CHECK: wire m_c_mask;
+; CHECK: wire m_c_en;
+; CHECK: wire m_c_clk;
+; CHECK: reg [1:0] GEN_0;
+; CHECK: reg [31:0] GEN_1;
+; CHECK: assign m_c_data = wen ? wdata : GEN_1;
+; CHECK: assign m_c_addr = index;
+; CHECK: assign m_c_mask = wen ? 1'h1 : 1'h0;
+; CHECK: assign m_c_en = 1'h1;
+; CHECK: assign m_c_clk = clk;
; CHECK: `ifndef SYNTHESIS
; CHECK: integer initvar;
; CHECK: initial begin
; CHECK: #0.002;
-; CHECK: for (initvar = 0; initvar < 4; initvar = initvar+1)
+; CHECK: for (initvar = 0; initvar < 4; initvar = initvar+1)
; CHECK: m[initvar] = {1{$random}};
+; CHECK: GEN_0 = {1{$random}};
+; CHECK: GEN_1 = {1{$random}};
; CHECK: end
; CHECK: `endif
-; CHECK: always @(posedge clk) begin
-; CHECK: if(wen) begin
-; CHECK: m[index] <= wdata;
-; CHECK: end
-; CHECK: end
+; CHECK: always @(posedge m_c_clk) begin
+; CHECK: if(m_c_en & m_c_mask) begin
+; CHECK: m[m_c_addr] <= m_c_data;
+; CHECK: end
+; CHECK: end
; CHECK: endmodule