[pinmux] Topgen updates for updated pinmux Signed-off-by: Michael Schaffner <msf@opentitan.org>
diff --git a/hw/top_earlgrey/data/top_earlgrey.sv.tpl b/hw/top_earlgrey/data/top_earlgrey.sv.tpl index 9052943..8d36e10 100644 --- a/hw/top_earlgrey/data/top_earlgrey.sv.tpl +++ b/hw/top_earlgrey/data/top_earlgrey.sv.tpl
@@ -6,10 +6,14 @@ import re import topgen.lib as lib -num_mio_input = sum([x["width"] if "width" in x else 1 for x in top["pinmux"]["inputs"]]) -num_mio_output = sum([x["width"] if "width" in x else 1 for x in top["pinmux"]["outputs"]]) -num_mio_inout = sum([x["width"] if "width" in x else 1 for x in top["pinmux"]["inouts"]]) +num_mio_inputs = sum([x["width"] for x in top["pinmux"]["inputs"]]) +num_mio_outputs = sum([x["width"] for x in top["pinmux"]["outputs"]]) +num_mio_inouts = sum([x["width"] for x in top["pinmux"]["inouts"]]) +num_mio = top["pinmux"]["num_mio"] +num_dio_inputs = sum([x["width"] if x["type"] == "input" else 0 for x in top["pinmux"]["dio"]]) +num_dio_outputs = sum([x["width"] if x["type"] == "output" else 0 for x in top["pinmux"]["dio"]]) +num_dio_inouts = sum([x["width"] if x["type"] == "inout" else 0 for x in top["pinmux"]["dio"]]) num_dio = sum([x["width"] if "width" in x else 1 for x in top["pinmux"]["dio"]]) num_im = sum([x["width"] if "width" in x else 1 for x in top["inter_signal"]["external"]]) @@ -43,24 +47,17 @@ input jtag_td_i, output jtag_td_o, -% if top["pinmux"]["num_mio"] != 0: +% if num_mio != 0: // Multiplexed I/O - input ${lib.bitarray(top["pinmux"]["num_mio"], max_sigwidth)} mio_in_i, - output logic ${lib.bitarray(top["pinmux"]["num_mio"], max_sigwidth)} mio_out_o, - output logic ${lib.bitarray(top["pinmux"]["num_mio"], max_sigwidth)} mio_oe_o, + input ${lib.bitarray(num_mio, max_sigwidth)} mio_in_i, + output logic ${lib.bitarray(num_mio, max_sigwidth)} mio_out_o, + output logic ${lib.bitarray(num_mio, max_sigwidth)} mio_oe_o, % endif % if num_dio != 0: - // Dedicated I/O - % for sig in top["pinmux"]["dio"]: - % if sig["type"] in ["input", "inout"]: - input ${lib.bitarray(sig["width"], max_sigwidth)} dio_${sig["name"]}_i, - % endif - % if sig["type"] in ["output", "inout"]: - output logic ${lib.bitarray(sig["width"], max_sigwidth)} dio_${sig["name"]}_o, - output logic ${lib.bitarray(sig["width"], max_sigwidth)} dio_${sig["name"]}_en_o, - % endif - % endfor + input ${lib.bitarray(num_dio, max_sigwidth)} dio_in_i, + output logic ${lib.bitarray(num_dio, max_sigwidth)} dio_out_o, + output logic ${lib.bitarray(num_dio, max_sigwidth)} dio_oe_o, % endif % if num_im != 0: @@ -142,9 +139,12 @@ % endfor // Signals - logic [${num_mio_input + num_mio_inout -1}:0] m2p; - logic [${num_mio_output + num_mio_inout -1}:0] p2m; - logic [${num_mio_output + num_mio_inout -1}:0] p2m_en; + logic [${num_mio_inputs + num_mio_inouts - 1}:0] mio2periph; + logic [${num_mio_outputs + num_mio_inouts - 1}:0] periph2mio; + logic [${num_mio_outputs + num_mio_inouts - 1}:0] periph2mio_en; + logic [${num_dio - 1}:0] dio2periph; + logic [${num_dio - 1}:0] periph2dio; + logic [${num_dio - 1}:0] periph2dio_en; % for m in top["module"]: // ${m["name"]} % for p_in in m["available_input_list"] + m["available_inout_list"]: @@ -591,13 +591,21 @@ % endif % if m["type"] == "pinmux": - .periph_to_mio_i (p2m ), - .periph_to_mio_oe_i (p2m_en ), - .mio_to_periph_o (m2p ), + .periph_to_mio_i (periph2mio ), + .periph_to_mio_oe_i (periph2mio_en ), + .mio_to_periph_o (mio2periph ), - .mio_out_o (mio_out_o), - .mio_oe_o (mio_oe_o ), - .mio_in_i (mio_in_i ), + .mio_out_o, + .mio_oe_o, + .mio_in_i, + + .periph_to_dio_i (periph2dio ), + .periph_to_dio_oe_i (periph2dio_en ), + .dio_to_periph_o (dio2periph ), + + .dio_out_o, + .dio_oe_o, + .dio_in_i, % endif % if m["type"] == "alert_handler": // TODO: wire this to hardware debug circuit @@ -665,36 +673,55 @@ % if "pinmux" in top: // Pinmux connections - % if num_mio_output + num_mio_inout != 0: - assign p2m = { + % if num_mio_outputs + num_mio_inouts != 0: + assign periph2mio = { % for sig in top["pinmux"]["inouts"] + top["pinmux"]["outputs"]: cio_${sig["name"]}_d2p${"" if loop.last else ","} % endfor }; - assign p2m_en = { + assign periph2mio_en = { % for sig in top["pinmux"]["inouts"] + top["pinmux"]["outputs"]: cio_${sig["name"]}_en_d2p${"" if loop.last else ","} % endfor }; % endif - % if num_mio_input + num_mio_inout != 0: + % if num_mio_inputs + num_mio_inouts != 0: assign { % for sig in top["pinmux"]["inouts"] + top["pinmux"]["inputs"]: cio_${sig["name"]}_p2d${"" if loop.last else ","} % endfor - } = m2p; + } = mio2periph; % endif % endif % if num_dio != 0: + // Dedicated IO connections + // Tie off output and output enable of input-only DIOs + assign periph2dio = { % for sig in top["pinmux"]["dio"]: - % if sig["type"] in ["input", "inout"]: - assign ${lib.ljust("cio_" + sig["name"] + "_p2d", max_diolength+9)} = dio_${sig["name"]}_i; - % endif - % if sig["type"] in ["output", "inout"]: - assign ${lib.ljust("dio_" + sig["name"] + "_o", max_diolength+9)} = cio_${sig["name"]}_d2p; - assign ${lib.ljust("dio_" + sig["name"] + "_en_o",max_diolength+9)} = cio_${sig["name"]}_en_d2p; - % endif + % if sig["type"] in ["output", "inout"]: + cio_${sig["name"]}_d2p${"" if loop.last else ","} + % else: + ${sig["width"]}'b0${"" if loop.last else ","} + % endif + % endfor + }; + + assign periph2dio_en = { + % for sig in top["pinmux"]["dio"]: + % if sig["type"] in ["output", "inout"]: + cio_${sig["name"]}_en_d2p${"" if loop.last else ","} + % else: + ${sig["width"]}'b0${"" if loop.last else ","} + % endif + % endfor + }; + + // No need to connect output-only DIOs + % for k, sig in enumerate(top["pinmux"]["dio"]): + % if sig["type"] in ["input", "inout"]: + assign cio_${sig["name"]}_p2d${" " * (max_diolength - len(sig["name"]))} = dio2periph[${num_dio - 1 - k}]; + % endif % endfor % endif