Fix elaboration of whole memory words used as indices

This commit is contained in:
Zachary Snow 2020-12-26 21:38:13 -07:00
parent af457ce8d0
commit 750831e3e0
4 changed files with 56 additions and 1 deletions

View File

@ -3451,7 +3451,14 @@ replace_fcall_later:;
if (current_scope[str]->children[0]->isConst())
newNode = current_scope[str]->children[0]->clone();
}
else if (at_zero && current_scope.count(str) > 0 && (current_scope[str]->type == AST_WIRE || current_scope[str]->type == AST_AUTOWIRE)) {
else if (at_zero && current_scope.count(str) > 0) {
AstNode *node = current_scope[str];
if (node->type == AST_WIRE || node->type == AST_AUTOWIRE || node->type == AST_MEMORY)
newNode = mkconst_int(0, sign_hint, width_hint);
}
break;
case AST_MEMRD:
if (at_zero) {
newNode = mkconst_int(0, sign_hint, width_hint);
}
break;

View File

@ -0,0 +1,4 @@
00 04 08 0c
10 14 18 1c
20 24 28 2c
30 34 38 3c

View File

@ -0,0 +1,21 @@
`define DATA 64'h492e5c4d7747e032
`define GATE(n, expr) \
module gate``n(sel, out); \
input wire [3:0] sel; \
output wire out; \
reg [63:0] bits; \
reg [5:0] ptrs[15:0]; \
initial bits = `DATA; \
initial $readmemh("memory_word_as_index.data", ptrs); \
assign out = expr; \
endmodule
`GATE(1, bits[ptrs[sel]])
`GATE(2, bits[ptrs[sel][5:0]])
`GATE(3, bits[ptrs[sel]+:1])
module gold(sel, out);
input wire [3:0] sel;
output wire out = `DATA >> (sel * 4);
endmodule

View File

@ -0,0 +1,23 @@
read_verilog memory_word_as_index.v
hierarchy
proc
memory
flatten
opt -full
equiv_make gold gate1 equiv
equiv_simple
equiv_status -assert
delete equiv
equiv_make gold gate2 equiv
equiv_simple
equiv_status -assert
delete equiv
equiv_make gold gate3 equiv
equiv_simple
equiv_status -assert