Skip to content

Commit 28dde1e

Browse files
hutch31sbourdeauducq
authored andcommittedApr 21, 2015
fhdl/verilog: add flag to produce ASIC-friendly output
1 parent b8bbaae commit 28dde1e

File tree

1 file changed

+33
-24
lines changed

1 file changed

+33
-24
lines changed
 

Diff for: ‎migen/fhdl/verilog.py

+33-24
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
from migen.fhdl.namer import Namespace, build_namespace
99
from migen.fhdl.conv_output import ConvOutput
1010

11-
1211
def _printsig(ns, s):
1312
if s.signed:
1413
n = "signed "
@@ -27,10 +26,10 @@ def _printintbool(node):
2726
else:
2827
return "1'd0", False
2928
elif isinstance(node, int):
29+
nbits = bits_for(node)
3030
if node >= 0:
31-
return str(bits_for(node)) + "'d" + str(node), False
31+
return str(nbits) + "'d" + str(node), False
3232
else:
33-
nbits = bits_for(node)
3433
return str(nbits) + "'sd" + str(2**nbits + node), True
3534
else:
3635
raise TypeError
@@ -152,7 +151,7 @@ def _list_comb_wires(f):
152151
return r
153152

154153

155-
def _printheader(f, ios, name, ns):
154+
def _printheader(f, ios, name, ns, asic_syntax=False):
156155
sigs = list_signals(f) | list_special_ios(f, True, True, True)
157156
special_outs = list_special_ios(f, False, True, True)
158157
inouts = list_special_ios(f, False, False, True)
@@ -178,44 +177,54 @@ def _printheader(f, ios, name, ns):
178177
if sig in wires:
179178
r += "wire " + _printsig(ns, sig) + ";\n"
180179
else:
181-
r += "reg " + _printsig(ns, sig) + " = " + _printexpr(ns, sig.reset)[0] + ";\n"
180+
if asic_syntax:
181+
r += "reg " + _printsig(ns, sig) + ";\n"
182+
else:
183+
r += "reg " + _printsig(ns, sig) + " = " + _printexpr(ns, sig.reset)[0] + ";\n"
182184
r += "\n"
183185
return r
184186

185187

186-
def _printcomb(f, ns, display_run):
188+
def _printcomb(f, ns, display_run, asic_syntax=False):
187189
r = ""
188190
if f.comb:
189191
# Generate a dummy event to get the simulator
190192
# to run the combinatorial process once at the beginning.
191193
syn_off = "// synthesis translate_off\n"
192194
syn_on = "// synthesis translate_on\n"
193-
dummy_s = Signal(name_override="dummy_s")
194-
r += syn_off
195-
r += "reg " + _printsig(ns, dummy_s) + ";\n"
196-
r += "initial " + ns.get_name(dummy_s) + " <= 1'd0;\n"
197-
r += syn_on
195+
if not asic_syntax:
196+
dummy_s = Signal(name_override="dummy_s")
197+
r += syn_off
198+
r += "reg " + _printsig(ns, dummy_s) + ";\n"
199+
r += "initial " + ns.get_name(dummy_s) + " <= 1'd0;\n"
200+
r += syn_on
198201

199202
groups = group_by_targets(f.comb)
200203

201204
for n, g in enumerate(groups):
202205
if len(g[1]) == 1 and isinstance(g[1][0], _Assign):
203206
r += "assign " + _printnode(ns, _AT_BLOCKING, 0, g[1][0])
204207
else:
205-
dummy_d = Signal(name_override="dummy_d")
206-
r += "\n" + syn_off
207-
r += "reg " + _printsig(ns, dummy_d) + ";\n"
208-
r += syn_on
208+
if not asic_syntax:
209+
dummy_d = Signal(name_override="dummy_d")
210+
r += "\n" + syn_off
211+
r += "reg " + _printsig(ns, dummy_d) + ";\n"
212+
r += syn_on
209213

210214
r += "always @(*) begin\n"
211215
if display_run:
212216
r += "\t$display(\"Running comb block #" + str(n) + "\");\n"
213-
for t in g[0]:
214-
r += "\t" + ns.get_name(t) + " <= " + _printexpr(ns, t.reset)[0] + ";\n"
215-
r += _printnode(ns, _AT_NONBLOCKING, 1, g[1])
216-
r += syn_off
217-
r += "\t" + ns.get_name(dummy_d) + " <= " + ns.get_name(dummy_s) + ";\n"
218-
r += syn_on
217+
if asic_syntax:
218+
for t in g[0]:
219+
r += "\t" + ns.get_name(t) + " = " + _printexpr(ns, t.reset)[0] + ";\n"
220+
r += _printnode(ns, _AT_BLOCKING, 1, g[1])
221+
else:
222+
for t in g[0]:
223+
r += "\t" + ns.get_name(t) + " <= " + _printexpr(ns, t.reset)[0] + ";\n"
224+
r += _printnode(ns, _AT_NONBLOCKING, 1, g[1])
225+
r += syn_off
226+
r += "\t" + ns.get_name(dummy_d) + " <= " + ns.get_name(dummy_s) + ";\n"
227+
r += syn_on
219228
r += "end\n"
220229
r += "\n"
221230
return r
@@ -284,7 +293,7 @@ def _printspecials(overrides, specials, ns, add_data_file):
284293
def convert(f, ios=None, name="top",
285294
special_overrides=dict(),
286295
create_clock_domains=True,
287-
display_run=False):
296+
display_run=False, asic_syntax=False):
288297
r = ConvOutput()
289298
if not isinstance(f, _Fragment):
290299
f = f.get_fragment()
@@ -314,8 +323,8 @@ def convert(f, ios=None, name="top",
314323
r.ns = ns
315324

316325
src = "/* Machine-generated using Migen */\n"
317-
src += _printheader(f, ios, name, ns)
318-
src += _printcomb(f, ns, display_run)
326+
src += _printheader(f, ios, name, ns, asic_syntax)
327+
src += _printcomb(f, ns, display_run, asic_syntax)
319328
src += _printsync(f, ns)
320329
src += _printspecials(special_overrides, f.specials - lowered_specials, ns, r.add_data_file)
321330
src += "endmodule\n"

0 commit comments

Comments
 (0)
Please sign in to comment.