Skip to content

print_bsv_reg

Write Bluespec Register file.

Classes:

PrintBSVReg

PrintBSVReg(bsvfile, test)

Bases: RDLListener

Write Register defination file.

Methods:

Source code in src/peakrdl_bsv/print_bsv_reg.py
 8
 9
10
11
12
def __init__(self, bsvfile, test):
    """Initialize."""
    self.file = bsvfile
    self.gentest = test
    self.addressmap = []

enter_Addrmap

enter_Addrmap(node)

Addressmap Handler.

Source code in src/peakrdl_bsv/print_bsv_reg.py
14
15
16
17
18
def enter_Addrmap(self, node):
    """Addressmap Handler."""
    self.addrmap_name = node.get_path_segment()
    print(f"import {self.addrmap_name}_signal::*;", file=self.file)
    self.addressmap.append(node.get_path_segment())

enter_Field

enter_Field(node)

Field Handler.

Source code in src/peakrdl_bsv/print_bsv_reg.py
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
def enter_Field(self, node):
    """Field Handler."""
    self.signal_name = node.get_path_segment()
    reset = "0"
    if "reset" in node.inst.properties:
        reset = node.inst.properties["reset"]
    self.interface += (
        f"interface HW_{self.reg_name}_{self.signal_name} s{self.signal_name};\n"
    )
    self.instance += f"Ifc_CSRSignal_{self.reg_name}_{self.signal_name} sig_{self.signal_name} <- mkCSRSignal_{self.reg_name}_{self.signal_name}({reset});\n"
    self.method += f"interface HW_{self.reg_name}_{self.signal_name} s{self.signal_name} = sig_{self.signal_name}.hw;\n"
    if node.is_sw_writable:
        self.write_method += f"sig_{self.signal_name}.bus.write(data[{node.high}:{node.low}],wstrb[{node.high}:{node.low}]);\n"
    # print(
    #     self.reg_name,
    #     self.signal_name,
    #     node.is_sw_writable,
    #     node.is_sw_readable,
    #     node.inst.properties,
    # )
    if node.is_sw_readable:
        self.read_method += f"let var_{self.signal_name}<-sig_{self.signal_name}.bus.read();\nrv[{node.high}:{node.low}]=var_{self.signal_name};\n"
    if node.is_hw_readable:
        self.reg_val.append((f"sig_{self.signal_name}.hw", node.high, node.low))
    else:
        self.reg_val.append((f"{node.width}'b0", node.high, node.low))

enter_Reg

enter_Reg(node)

RegHandler.

Source code in src/peakrdl_bsv/print_bsv_reg.py
20
21
22
23
24
25
26
27
28
29
def enter_Reg(self, node):
    """RegHandler."""
    self.reg_name = node.get_path_segment()
    self.hier_path = [*self.addressmap, self.reg_name]
    self.interface = ""
    self.reg_val = []
    self.instance = ""
    self.method = ""
    self.write_method = "//write methods\n"
    self.read_method = "//read methods\n"

exit_Reg

exit_Reg(node)

Write out register file.

Source code in src/peakrdl_bsv/print_bsv_reg.py
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
    def exit_Reg(self, node):
        """Write out register file."""
        width = node.inst.properties["regwidth"]
        value_method = []
        value_method.append("let rv=0;")
        for r in self.reg_val:
            value_method.append(f"rv[{r[1]}:{r[2]}]={r[0]};")
        value_method_joined = "\n".join(value_method)
        print(
            f"""
interface ConfigReg_HW_{self.reg_name};
    {self.interface}
    method Bit#({width}) value();

endinterface

interface ConfigReg_Bus_{self.reg_name};
    method Action write( Bit#({width}) data,Bit#({width})wstrb);
    method ActionValue#(Bit#({width})) read();
endinterface

interface ConfigReg_{self.reg_name};
interface ConfigReg_HW_{self.reg_name} hw;
interface ConfigReg_Bus_{self.reg_name} bus;
endinterface
module mkConfigReg_{self.reg_name}(ConfigReg_{self.reg_name});
    {self.instance}
interface ConfigReg_HW_{self.reg_name} hw;
    {self.method}
    method Bit#({width}) value();
    {value_method_joined}
    return rv;
    endmethod
endinterface
interface ConfigReg_Bus_{self.reg_name} bus;
    method Action write(Bit#({width}) data,Bit#({width}) wstrb);
    {self.write_method}
    endmethod
    method ActionValue#(Bit#({width})) read;
        Bit#({width}) rv=0;
    {self.read_method}
    return rv;
    endmethod
endinterface
endmodule
                  """,
            file=self.file,
        )