systemverilog-plugin: convert memory when accessing slice

Signed-off-by: Kamil Rakoczy <krakoczy@antmicro.com>
diff --git a/systemverilog-plugin/UhdmAst.cc b/systemverilog-plugin/UhdmAst.cc
index f0dbade..236fe7c 100644
--- a/systemverilog-plugin/UhdmAst.cc
+++ b/systemverilog-plugin/UhdmAst.cc
@@ -428,8 +428,26 @@
             }
         }
         if (node->type == AST::AST_IDENTIFIER && memories.count(node->str)) {
-            if (!memories[node->str]->attributes.count(UhdmAst::force_convert()) && node->children.size() == 0) {
-                add_force_convert_attribute(memories[node->str]);
+            if (!memories[node->str]->attributes.count(UhdmAst::force_convert())) {
+                bool force_convert = false;
+                // convert memory to list of registers
+                // in case of access to whole memory
+                // or slice of memory
+                // e.g.
+                // logic [3:0] mem [8:0];
+                // always_ff @ (posedge clk) begin
+                //   mem <= '{default:0};
+                //   mem[7:1] <= mem[6:0];
+                // end
+                if (node->children.size() == 0) {
+                    force_convert = true;
+                }
+                if (node->children.size() == 1 && node->children[0]->children.size() != 1) {
+                    force_convert = true;
+                }
+                if (force_convert) {
+                    add_force_convert_attribute(memories[node->str]);
+                }
             }
         }
     });