2 # -*- coding: utf-8 -*-
4 =======================================
5 module_name: vut_generator
6 ---------------------------------------
7 Author: Rodrigo Peixoto
9 ---------------------------------------
11 - This modules generates the Verilog
12 module skeleton, based in the vut
14 =======================================
19 DEST_GEN_FILES
="./gen/"
22 def __init__(self
, vmodule
, flags
={}):
24 self
.vmodule
= vmodule
25 print "Code generation stars"
27 def get_(self
, items
=[], string_label
=""):
30 yield " %s [%d:%d] %s;" % (string_label
, sig
[1][0], sig
[1][1], sig
[0])
32 yield " %s %s;" % (string_label
, sig
[0])
34 def get_memories(self
):
35 items
= self
.vmodule
.in_ports
+ self
.vmodule
.out_ports
36 verf_items
= self
.vmodule
.in_ports_behavior
+ self
.vmodule
.out_ports_behavior
40 mem_len
= len(verf_items
[items
.index(sig
)].get_content()) -1
42 yield " reg [%d:%d] mem_%s [0:%d];" % (sig
[1][0], sig
[1][1], sig
[0], mem_len
)
44 yield " reg mem_%s [0:%d];" % (sig
[0], mem_len
)
46 def gen_module_skeleton(self
):
47 inputs
= list(self
.get_(self
.vmodule
.in_ports
, "input"))
49 outputs
= list(self
.get_(self
.vmodule
.out_ports
, "output"))
51 wires
= list(self
.get_(self
.vmodule
.in_ports
, "wire"))
53 regs
= list(self
.get_(self
.vmodule
.out_ports
, "reg"))
55 verilog_code
= BASIC_SKELETON
% {'module_name':self
.vmodule
.name
,
56 'ports':','.join([x
[0] for x
in self
.vmodule
.in_ports
] + [x
[0] for x
in self
.vmodule
.out_ports
]),
57 'inputs':"\n".join(inputs
),
58 'outputs':"\n".join(outputs
),
59 'wires':"\n".join(wires
),
60 'regs':"\n".join(regs
),
62 file = open(DEST_GEN_FILES
+ "%s.v" % self
.vmodule
.name
, "w")
63 file.writelines(verilog_code
)
68 regs
= list(self
.get_(self
.vmodule
.in_ports
, "reg"))
70 wires
= list(self
.get_(self
.vmodule
.out_ports
, "wire"))
72 memos
= list(self
.get_memories())
75 def gen_module_inst():
76 ret
=" %(module)s test(\n%(cons)s);"
78 for p
in self
.vmodule
.in_ports
+ self
.vmodule
.out_ports
:
79 cons
.append(" .%(port)s(%(port)s)" % {'port':p
[0]})
80 return ret
% {'module':self
.vmodule
.name
,
81 'cons':',\n'.join(cons
)}
85 for p
in self
.vmodule
.out_ports
:
87 ret
.append(" reg [%d:%d] tmp_%s;" % (p
[1][0], p
[1][1], p
[0]))
89 ret
.append(" reg tmp_%s;" % p
[0])
92 def gen_initial_mems():
94 for p
in self
.vmodule
.in_ports
:
95 ret
.append(' initial $readmemh("i_%(port)s.mem",mem_%(port)s);' % {'port':p
[0]})
96 for p
in self
.vmodule
.out_ports
:
97 ret
.append(' initial $readmemh("o_%(port)s.mem",mem_%(port)s);' % {'port':p
[0]})
102 for p
in self
.vmodule
.in_ports
:
103 ret
.append(" %s = 0;" % p
[0])
104 return '\n'.join(ret
)
108 for p
in self
.vmodule
.in_ports
:
109 ret
.append(8*" " + "%(p)s = mem_%(p)s[k];" % {'p':p
[0]})
110 for p
in self
.vmodule
.out_ports
:
111 ret
.append(8*" " + "tmp_%(p)s = mem_%(p)s[k];" % {'p':p
[0]})
112 return '\n'.join(ret
)
116 for p
in self
.vmodule
.out_ports
:
118 return ' or '.join(ret
)
122 for p
in self
.vmodule
.out_ports
:
123 ret
.append(BASIC_IF
% {'port': p
[0]})
124 return '\n'.join(ret
)
126 behavior_code
= BASIC_VUT_BEHAVIOR
% {'memories':'\n'.join(memos
),
127 'tmpmem': gen_tmp_mem(),
128 'module': gen_module_inst(),
129 'initialmems': gen_initial_mems(),
130 'initregs': gen_init_regs(),
131 'memlen': len(self
.vmodule
.in_ports_behavior
[0].content
),
133 'mematt': gen_set_regs(),
134 'outlist':gen_sens_list(),
135 'iferrors': gen_if_errors(),
136 'tofin': len(self
.vmodule
.in_ports_behavior
[0].content
) * 10
139 verilog_code
= BASIC_SKELETON
% {'module_name':"vut_" + self
.vmodule
.name
,
143 'wires':"\n".join(wires
),
144 'regs':"\n".join(regs
),
145 'behavior': behavior_code
}
148 file = open(DEST_GEN_FILES
+ "vut_%s.v" % self
.vmodule
.name
, "w")
149 file.writelines(verilog_code
)
152 for in_p
in self
.vmodule
.in_ports_behavior
:
153 f
= open(DEST_GEN_FILES
+ in_p
.name
+ ".mem", "w")
154 f
.write("\n".join(in_p
.content
) + '\n')
157 for out_p
in self
.vmodule
.out_ports_behavior
:
158 f
= open(DEST_GEN_FILES
+ out_p
.name
+ ".mem", "w")
159 f
.write("\n".join(out_p
.content
) + '\n')
163 if 'skel' in self
.flags
:
164 self
.gen_module_skeleton()
165 print "--> code generated %s.v" % self
.vmodule
.name
167 print "--> code generated vut_%s.v" % self
.vmodule
.name
169 if __name__
== '__main__':
170 vm
= VerilogModule("Teste_de_geracao")
171 vm
.in_ports
.append(('a', (3, 0)))
172 vm
.in_ports
.append(('c',))
173 vm
.in_ports
.append(('d', (3, 0)))
174 vm
.in_ports_behavior
.append( MemoryIO('a',['4','F','A','9','4']))
175 vm
.in_ports_behavior
.append( MemoryIO('c',['4','F','A','9']))
176 vm
.in_ports_behavior
.append( MemoryIO('d',['4','F','A','9']))
177 vm
.out_ports
.append(('e', (3, 0)))
178 vm
.out_ports
.append(('f', (3, 0)))
179 vm
.out_ports
.append(('g', (3, 0)))
180 vm
.in_ports_behavior
.append( MemoryIO('e',['4','F','A','9']))
181 vm
.in_ports_behavior
.append( MemoryIO('f',['4','F','A','9','','6']))
182 vm
.in_ports_behavior
.append( MemoryIO('g',['4','F','A','9']))
184 test
= VUTGenerator(vm
)