tinyriscv/tools/regtool/topgen/templates/tb__xbar_connect.sv.tpl

124 lines
4.2 KiB
Smarty

// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
//
// tb__xbar_connect generated by `topgen.py` tool
<%
from collections import OrderedDict
import topgen.lib as lib
top_hier = 'tb.dut.top_' + top["name"] + '.'
clk_hier = top_hier + top["clocks"].hier_paths["top"]
clk_src = OrderedDict()
for xbar in top["xbar"]:
for clk, src in xbar["clock_srcs"].items():
clk_src[clk] = src
clk_freq = OrderedDict()
for clock in top["clocks"].all_srcs.values():
if clock.name in clk_src.values():
clk_freq[clock.name] = clock.freq
hosts = OrderedDict()
devices = OrderedDict()
for xbar in top["xbar"]:
for node in xbar["nodes"]:
if node["type"] == "host" and not node["xbar"]:
hosts[node["name"]] = "clk_" + clk_src[node["clock"]]
elif node["type"] == "device" and not node["xbar"]:
devices[node["name"]] = "clk_" + clk_src[node["clock"]]
def escape_if_name(qual_if_name):
return qual_if_name.replace('.', '__')
%>\
<%text>
`define DRIVE_CHIP_TL_HOST_IF(tl_name, inst_name, sig_name) \
force ``tl_name``_tl_if.d2h = dut.top_earlgrey.u_``inst_name``.``sig_name``_i; \
force dut.top_earlgrey.u_``inst_name``.``sig_name``_o = ``tl_name``_tl_if.h2d; \
force dut.top_earlgrey.u_``inst_name``.clk_i = 0; \
uvm_config_db#(virtual tl_if)::set(null, $sformatf("*env.%0s_agent", `"tl_name`"), "vif", \
``tl_name``_tl_if);
`define DRIVE_CHIP_TL_DEVICE_IF(tl_name, inst_name, sig_name) \
force ``tl_name``_tl_if.h2d = dut.top_earlgrey.u_``inst_name``.``sig_name``_i; \
force dut.top_earlgrey.u_``inst_name``.``sig_name``_o = ``tl_name``_tl_if.d2h; \
force dut.top_earlgrey.u_``inst_name``.clk_i = 0; \
uvm_config_db#(virtual tl_if)::set(null, $sformatf("*env.%0s_agent", `"tl_name`"), "vif", \
``tl_name``_tl_if);
`define DRIVE_CHIP_TL_EXT_DEVICE_IF(tl_name, port_name) \
force ``tl_name``_tl_if.h2d = dut.top_earlgrey.``port_name``_req_o; \
force dut.top_earlgrey.``port_name``_rsp_i = ``tl_name``_tl_if.d2h; \
uvm_config_db#(virtual tl_if)::set(null, $sformatf("*env.%0s_agent", `"tl_name`"), "vif", \
``tl_name``_tl_if);
</%text>\
% for c in clk_freq.keys():
wire clk_${c};
clk_rst_if clk_rst_if_${c}(.clk(clk_${c}), .rst_n(rst_n));
% endfor
% for i, clk in hosts.items():
tl_if ${escape_if_name(i)}_tl_if(${clk}, rst_n);
% endfor
% for i, clk in devices.items():
tl_if ${escape_if_name(i)}_tl_if(${clk}, rst_n);
% endfor
initial begin
bit xbar_mode;
void'($value$plusargs("xbar_mode=%0b", xbar_mode));
if (xbar_mode) begin
// only enable assertions in xbar as many pins are unconnected
$assertoff(0, tb);
% for xbar in top["xbar"]:
$asserton(0, tb.dut.top_${top["name"]}.u_xbar_${xbar["name"]});
% endfor
% for c in clk_freq.keys():
clk_rst_if_${c}.set_active(.drive_rst_n_val(0));
clk_rst_if_${c}.set_freq_khz(${clk_freq[c]} / 1000);
% endfor
// bypass clkmgr, force clocks directly
% for xbar in top["xbar"]:
% for clk, src in xbar["clock_srcs"].items():
force ${top_hier}u_xbar_${xbar["name"]}.${clk} = clk_${src};
% endfor
% endfor
// bypass rstmgr, force resets directly
% for xbar in top["xbar"]:
% for rst in xbar["reset_connections"]:
force ${top_hier}u_xbar_${xbar["name"]}.${rst} = rst_n;
% endfor
% endfor
% for xbar in top["xbar"]:
% for node in xbar["nodes"]:
<%
clk = 'clk_' + clk_src[node["clock"]]
esc_name = node['name'].replace('.', '__')
inst_sig_list = lib.find_otherside_modules(top, xbar["name"], 'tl_' + esc_name)
inst_name = inst_sig_list[0][1]
sig_name = inst_sig_list[0][2]
%>\
% if node["type"] == "host" and not node["xbar"]:
`DRIVE_CHIP_TL_HOST_IF(${esc_name}, ${inst_name}, ${sig_name})
% elif node["type"] == "device" and not node["xbar"] and node["stub"]:
`DRIVE_CHIP_TL_EXT_DEVICE_IF(${esc_name}, ${inst_name}_${sig_name})
% elif node["type"] == "device" and not node["xbar"]:
`DRIVE_CHIP_TL_DEVICE_IF(${esc_name}, ${inst_name}, ${sig_name})
% endif
% endfor
% endfor
end
end
`undef DRIVE_CHIP_TL_HOST_IF
`undef DRIVE_CHIP_TL_DEVICE_IF
`undef DRIVE_CHIP_TL_EXT_DEVICE_IF