aboutsummaryrefslogtreecommitdiffstats
path: root/tests/opt/opt_mem_feedback.ys
diff options
context:
space:
mode:
authorMarcelina Koƛcielnicka <mwk@0x04.net>2021-05-24 21:21:51 +0200
committerMarcelina Koƛcielnicka <mwk@0x04.net>2021-05-24 23:20:30 +0200
commit835688bf80eb9db7241c1aa767b7e97dad1c0eeb (patch)
tree44f13de8fec92580cc7e82de0d7744930dec58e8 /tests/opt/opt_mem_feedback.ys
parentb706adb809f17ea897e8534a7ee3ae833b243d2b (diff)
downloadyosys-835688bf80eb9db7241c1aa767b7e97dad1c0eeb.tar.gz
yosys-835688bf80eb9db7241c1aa767b7e97dad1c0eeb.tar.bz2
yosys-835688bf80eb9db7241c1aa767b7e97dad1c0eeb.zip
opt_mem_feedback: Rewrite feedback path finding logic.
Fixes #2766.
Diffstat (limited to 'tests/opt/opt_mem_feedback.ys')
-rw-r--r--tests/opt/opt_mem_feedback.ys142
1 files changed, 142 insertions, 0 deletions
diff --git a/tests/opt/opt_mem_feedback.ys b/tests/opt/opt_mem_feedback.ys
new file mode 100644
index 000000000..6a68921c3
--- /dev/null
+++ b/tests/opt/opt_mem_feedback.ys
@@ -0,0 +1,142 @@
+# Good case: proper feedback port.
+
+read_verilog << EOT
+
+module top(...);
+
+input clk;
+input en;
+input s;
+
+input [3:0] ra;
+output [15:0] rd;
+input [3:0] wa;
+input [15:0] wd;
+
+reg [15:0] mem[0:15];
+
+assign rd = mem[ra];
+
+always @(posedge clk) begin
+ if (en) begin
+ mem[wa] <= {mem[wa][15:8], s ? wd[7:0] : mem[wa][7:0]};
+ end
+end
+
+endmodule
+
+EOT
+
+hierarchy -auto-top
+proc
+opt_clean
+
+design -save start
+memory_map
+design -save preopt
+
+design -load start
+opt_mem_feedback
+select -assert-count 1 t:$memrd
+memory_map
+design -save postopt
+
+equiv_opt -assert -run prepare: :
+
+
+
+design -reset
+
+# Bad case: read port also used for other things.
+
+read_verilog << EOT
+
+module top(...);
+
+input clk;
+input en;
+input s;
+
+output [15:0] rd;
+input [3:0] wa;
+input [15:0] wd;
+
+reg [15:0] mem[0:15];
+
+assign rd = mem[wa];
+
+always @(posedge clk) begin
+ if (en) begin
+ mem[wa] <= {s ? rd : wd[15:8], s ? wd[7:0] : rd};
+ end
+end
+
+endmodule
+
+EOT
+
+hierarchy -auto-top
+proc
+opt_clean
+
+design -save start
+memory_map
+design -save preopt
+
+design -load start
+select -assert-count 1 t:$memrd
+opt_mem_feedback
+select -assert-count 1 t:$memrd
+memory_map
+design -save postopt
+
+equiv_opt -assert -run prepare: :
+
+
+
+design -reset
+
+# Bad case: another user of the mux out.
+
+read_verilog << EOT
+
+module top(...);
+
+input clk;
+input en;
+input s;
+
+output [15:0] rd;
+input [3:0] wa;
+input [15:0] wd;
+
+reg [15:0] mem[0:15];
+
+assign rd = s ? wd : mem[wa];
+
+always @(posedge clk) begin
+ if (en) begin
+ mem[wa] <= rd;
+ end
+end
+
+endmodule
+
+EOT
+
+hierarchy -auto-top
+proc
+opt_clean
+
+design -save start
+memory_map
+design -save preopt
+
+design -load start
+select -assert-count 1 t:$memrd
+opt_mem_feedback
+select -assert-count 1 t:$memrd
+memory_map
+design -save postopt
+
+equiv_opt -assert -run prepare: :