예제 #1
0
    def _registerClearConnection(self):
            self.architecture.bodyCodeFooter.add(vhdl.indent(1) + "--External Clear Connection")
            for register_num, register_word in self.reg.items():
                for index, register in register_word.items():
                    if (isinstance(register,RegisterBit) or isinstance(register,RegisterSlice)):
                        if self.useRecords:
                            clearname = register.clearName
                        else:
                            clearname = register.clearName + "_i"

                        if register.size == 1:
                            defaultvalue = "'1'"
                            elsevalue = "'0'"
                            vectorRange = str(index)
                        else:
                            vectorRange = "%d downto %d" % (index+register.size-1, index)
                            tmp = register.vhdlRange.replace("(","")
                            tmp = tmp.replace(")","")
                            defaultvalue = "(%s => '1')" % tmp
                            elsevalue = "(%s => '0')" % tmp

                        if ( register.regType == "Write2Clear" or register.regType == "Write2Pulse"):
                            elsevalue = "regwrite_s(%d)(%s)" % (register_num, vectorRange)
                        if register.externalClear:
                            self.architecture.bodyCodeFooter.add(vhdl.indent(1) + "regclear_s(%d)(%s) <= %s when %s = '1' else %s;" %
                                                                (register_num, vectorRange, defaultvalue, clearname, elsevalue))
                        elif ( register.regType == "Write2Clear" or register.regType == "Write2Pulse"):
                            self.architecture.bodyCodeFooter.add(vhdl.indent(1) + "regclear_s(%d)(%s) <= %s;" % (register_num, vectorRange, elsevalue) )
예제 #2
0
    def code(self, indent_level=0):
        hdl_code = ""
        hdl_code = vhdl.indent(indent_level) + ("package body %s is\r\n" %
                                                self.name)
        hdl_code = hdl_code + "\r\n"
        # Header
        if (self.bodyCodeHeader):
            hdl_code = hdl_code + self.bodyCodeHeader.code()
            hdl_code = hdl_code + "\r\n"
        # Functions
        hdl_code = hdl_code + vhdl.indent(indent_level + 1) + (
            "-- Functions & Procedures\r\n")
        if (self.subPrograms):
            hdl_code = hdl_code + self.subPrograms.code()
            hdl_code = hdl_code + "\r\n"
        else:
            hdl_code = hdl_code + vhdl.indent(indent_level + 2) + (
                "-- subprograms_declaration_tag\r\n")

        # Footer
        if (self.bodyCodeHeader):
            hdl_code = hdl_code + self.bodyCodeFooter.code()
            hdl_code = hdl_code + "\r\n"
        hdl_code = hdl_code + vhdl.indent(indent_level) + (
            "end package body;\r\n")
        hdl_code = hdl_code + "\r\n"
        return hdl_code
예제 #3
0
    def _registerSetConnection(self):
        self.architecture.bodyCodeFooter.add(vhdl.indent(1) + "--Set Connection for Write to Clear")
        for reg_num, register_word in self.reg.items():
            for index, register in register_word.items():
                if isinstance(register, RegisterBit) or isinstance(register, RegisterSlice):
                    if register.size == 1:
                        vectorRange = str(index)

                    else:
                        vectorRange = "%d downto %d" % (index+register.size-1, index)

                    if register.regType == "Write2Clear":
                        self.architecture.bodyCodeFooter.add(vhdl.indent(1) + "regset_s(%d)(%s) <= %s;" % (reg_num, vectorRange, register.vhdlName))

        self.architecture.bodyCodeFooter.add("")
예제 #4
0
    def _registerConnection(self):
        self.architecture.bodyCodeFooter.add(vhdl.indent(1) + "--Register Connection")
        for register_num, register_word in self.reg.items():
            for index, register in register_word.items():
                if isinstance(register, RegisterBit) or isinstance(register, RegisterSlice):
                    if register.size == 1:
                        vectorRange = str(index)
                    else:
                        vectorRange = "%d downto %d" % (index+register.size-1, index)
                        register.name = register.name+"(%d downto 0)" % (register.size-1)

                    if "ReadOnly" in register.regType:
                        self.architecture.bodyCodeFooter.add(vhdl.indent(1) + "regread_s(%d)(%s) <= %s;" % (register_num, vectorRange, register.vhdlName))

                    elif "SplitReadWrite" in register.regType:
                        self.architecture.bodyCodeFooter.add(vhdl.indent(1) + "%s <= regwrite_s(%d)(%s);" %
                                                             (register.inv_vhdlName, register_num, vectorRange))
                        self.architecture.bodyCodeFooter.add(vhdl.indent(1) + "regread_s(%d)(%s) <= %s;" %
                                                             (register_num, vectorRange, register.vhdlName))

                    elif "ReadWrite" in register.regType:
                        self.architecture.bodyCodeFooter.add(vhdl.indent(1) + "%s <= regwrite_s(%d)(%s);" % (register.vhdlName, register_num, vectorRange))
                        self.architecture.bodyCodeFooter.add(vhdl.indent(1) + "regread_s(%d)(%s) <= regwrite_s(%d)(%s);" %
                                                             (register_num, vectorRange, register_num, vectorRange))
                    elif "Write2Clear" in register.regType:
                        # self.architecture.bodyCodeFooter.add(vhdl.indent(1) + "regread_s(%d)(%s) <= %s;" % (register_num,vectorRange,register.name))
                        pass

                    elif "Write2Pulse" in register.regType:
                        self.architecture.bodyCodeFooter.add(vhdl.indent(1) + "%s <= regwrite_s(%d)(%s);" % (register.vhdlName, register_num, vectorRange))

        self.architecture.bodyCodeFooter.add("\r\n")
예제 #5
0
    def code(self, indent_level=0):
        hdl_code = ""
        hdl_code = vhdl.indent(indent_level) + ("package %s is\r\n" %
                                                self.name)
        hdl_code = hdl_code + "\r\n"
        # Pkg Generics
        if (self.generic or self.genericTypes):
            hdl_code = hdl_code + vhdl.indent(indent_level +
                                              1) + ("generic  (\r\n")
            hdl_code = hdl_code + self.generic.code(indent_level + 1)
            hdl_code = hdl_code + self.genericTypes.code(indent_level + 1)
            hdl_code = hdl_code + vhdl.indent(indent_level + 1) + ("--);\r\n")
            hdl_code = hdl_code + "\r\n"
        else:
            hdl_code = hdl_code + vhdl.indent(indent_level +
                                              1) + ("--generic  (\r\n")
            hdl_code = hdl_code + vhdl.indent(indent_level + 2) + (
                "--Package Generics go here.\r\n")
            hdl_code = hdl_code + vhdl.indent(indent_level + 1) + ("--);\r\n")
            hdl_code = hdl_code + "\r\n"

        hdl_code = hdl_code + self.declarationHeader.code()
        hdl_code = hdl_code + self.constant.code()
        hdl_code = hdl_code + self.customTypes.code()
        hdl_code = hdl_code + self.customTypesConstants.code()
        hdl_code = hdl_code + self.signal.code()
        hdl_code = hdl_code + self.subPrograms.declaration()
        hdl_code = hdl_code + self.component.code()
        hdl_code = hdl_code + self.declarationFooter.code()
        hdl_code = hdl_code + vhdl.indent(0) + ("end %s;\r\n" % self.name)
        hdl_code = hdl_code + "\r\n"
        return hdl_code
예제 #6
0
    def write_testbench(self):
        self._generate()
        testbench = vhdl.BasicVHDL(self.entity.name+"_tb","simulation")
        testbench.entity.generic.add("runner_cfg", "string", "")
        testbench.entity.generic.add("run_time", "integer", "100")
        testbench.library = self.library
        testbench.library.add("std")
        testbench.library["std"].package.add("textio")
        testbench.library.add("vunit_lib")
        testbench.library["vunit_lib"].context.add("vunit_context")
        testbench.library["vunit_lib"].context.add("vc_context")
        testbench.work.add(self.pkg.name)

        for index, generic in self.entity.generic.items():
            testbench.architecture.constant.add(index,generic.type,generic.value)

        testbench.architecture.constant.add("axi_handle","bus_master_t","new_bus(data_length => C_S_AXI_DATA_WIDTH, address_length => C_S_AXI_ADDR_WIDTH)")
        testbench.architecture.constant.add("addr_increment_c","integer",str(self.addr_increment))

        for port in self.entity.port:
            testbench.architecture.signal.add(port,self.entity.port[port].type)
        # set starting value to clock. All other signals should be handled by reset.
        testbench.architecture.signal["S_AXI_ACLK"].value = "'0'"


        testbench.architecture.instances.add("axi_master_u","entity vunit_lib.axi_lite_master")
        testbench.architecture.instances["axi_master_u"].generic.add("bus_handle","","axi_handle")

        for local_port in list(vunitPort.keys()):
            testbench.architecture.instances["axi_master_u"].port.add(local_port,"","")
            testbench.architecture.instances["axi_master_u"].port[local_port].assign(vunitPort[local_port])

        testbench.architecture.instances.append(self.instanciation("dut_u"))
        read_only = vhdl.GenericCodeBlock()
        read_write = vhdl.GenericCodeBlock()
        split_read_write = vhdl.GenericCodeBlock()
        write_to_clear = vhdl.GenericCodeBlock()
        write_to_pulse = vhdl.GenericCodeBlock()
        external_clear = vhdl.GenericCodeBlock()

        for reg_number, register_word in self.reg.items():
            reg_address = reg_number * self.addr_increment

            for index, register in register_word.items():
                if not (isinstance(register,RegisterBit) or isinstance(register,RegisterSlice)):
                    continue

                if register.size == 1:
                    tb_value = random_bit()
                    vector_location = "(%s)" % index
                    all_one = "'1'"
                    all_zero = "'0'"

                else:
                    tb_value = random_vector(register.size)
                    vector_location = "(%s downto %s)" % (register.size + index - 1, index)
                    all_one = "(others=>'1')"
                    all_zero = "(others=>'0')"

                if register.regType == "ReadOnly":
                    testbench.architecture.bodyCodeFooter.add(vhdl.indent(1) + "--Read Only: %s;" % register.vhdlName)
                    testbench.architecture.bodyCodeFooter.add(vhdl.indent(1) + "%s <= %s;" % (register.vhdlName, tb_value))
                    read_only.add(vhdl.indent(1) + "--Testing %s" % register.vhdlName)
                    read_only.add(vhdl.indent(1) + "read_bus(net,axi_handle,%d,rdata_v);" % reg_address )
                    read_only.add(vhdl.indent(1) + "check_equal(rdata_v%s,%s,result(\"Test Read: %s.\"));" % ( vector_location, register.vhdlName, register.vhdlName ))

                if register.regType == "ReadWrite":
                    tb_value = random_vector(self.datasize)
                    read_write.add(vhdl.indent(1) + "--Testing %s" % register.vhdlName)
                    read_write.add(vhdl.indent(1) + "rdata_v := %s;" % tb_value)
                    read_write.add(vhdl.indent(1) + "write_bus(net,axi_handle,%d,rdata_v,%s);" % (reg_address, register.byte_enable) )
                    read_write.add(vhdl.indent(1) + "read_bus(net,axi_handle,%d,rdata_v);" % reg_address )
                    read_write.add(vhdl.indent(1) + "check_equal(%s,rdata_v%s,result(\"Test Readback and Port value: %s.\"));" % ( register.vhdlName, vector_location, register.vhdlName ))

                if register.regType == "SplitReadWrite":
                    testbench.architecture.bodyCodeFooter.add(vhdl.indent(1) + "--Split Read and Write: %s;" % register.vhdlName)
                    testbench.architecture.bodyCodeFooter.add(vhdl.indent(1) + "%s <= %s;" % (register.vhdlName, tb_value))
                    split_read_write.add(vhdl.indent(1) + "--Testing %s" % register.vhdlName)
                    split_read_write.add(vhdl.indent(1) + "read_bus(net,axi_handle,%d,rdata_v);" % reg_address )
                    split_read_write.add(vhdl.indent(1) + "check_equal(rdata_v%s,%s,result(\"Test Read: %s.\"));" % ( vector_location, register.vhdlName, register.vhdlName ))
                    tb_value = random_vector(self.datasize)
                    split_read_write.add(vhdl.indent(1) + "--Testing %s" % register.inv_vhdlName)
                    split_read_write.add(vhdl.indent(1) + "rdata_v := %s;" % tb_value )
                    split_read_write.add(vhdl.indent(1) + "write_bus(net,axi_handle,%d,rdata_v,%s);" % (reg_address, register.byte_enable) )
                    split_read_write.add(vhdl.indent(1) + "wait for 1 us;")
                    split_read_write.add(vhdl.indent(1) + "check_equal(%s,rdata_v%s,result(\"Test Read: %s.\"));" % ( register.inv_vhdlName, vector_location, register.inv_vhdlName ))

                if register.regType == "Write2Clear":
                    write_to_clear.add(vhdl.indent(1) + "--Testing %s: Set to %s" % (register.vhdlName, all_one) )
                    write_to_clear.add(vhdl.indent(1) + "%s <= %s;" % (register.vhdlName, all_one))
                    write_to_clear.add(vhdl.indent(1) + "wait until rising_edge(S_AXI_ACLK);")
                    write_to_clear.add(vhdl.indent(1) + "%s <= %s;" % (register.vhdlName, all_zero))
                    write_to_clear.add(vhdl.indent(1) + "wait until rising_edge(S_AXI_ACLK);")
                    write_to_clear.add(vhdl.indent(1) + "read_bus(net,axi_handle,%d,rdata_v);" % reg_address )
                    write_to_clear.add(vhdl.indent(1) + "check(rdata_v%s = %s,result(\"Test Read Ones: %s.\"));" % ( vector_location, tb_value.replace('0','1'), register.vhdlName ))
                    write_to_clear.add(vhdl.indent(1) + "rdata_v := (others=>'0');" )
                    write_to_clear.add(vhdl.indent(1) + "rdata_v%s := %s;" % (vector_location, all_one) )
                    write_to_clear.add(vhdl.indent(1) + "write_bus(net,axi_handle,%d,rdata_v,%s);" % (reg_address, register.byte_enable) )
                    write_to_clear.add(vhdl.indent(1) + "read_bus(net,axi_handle,%d,rdata_v);" % reg_address )
                    write_to_clear.add(vhdl.indent(1) + "check(rdata_v%s = %s,result(\"Test Read Zeroes: %s.\"));" % ( vector_location, tb_value.replace('1','0'), register.vhdlName ))

                if register.regType == "Write2Pulse":
                    write_to_pulse.add(vhdl.indent(1) + "--Testing %s" % register.vhdlName)
                    write_to_pulse.add(vhdl.indent(1) + "rdata_v%s := %s;" % (vector_location, all_one) )
                    write_to_pulse.add(vhdl.indent(1) + "write_bus(net,axi_handle,%d,rdata_v,%s);" % (reg_address, register.byte_enable) )
                    write_to_pulse.add(vhdl.indent(1) + "wait until %s = %s;" % (register.vhdlName, tb_value.replace("0","1")) )

        read_only.add(vhdl.indent(1) + "check_passed(result(\"Read Out Test Pass.\"));")
        read_write.add(vhdl.indent(1) + "check_passed(result(\"Read and Write Test Pass.\"));")
        split_read_write.add(vhdl.indent(1) + "check_passed(result(\"Split Read Write Test Pass.\"));")
        write_to_clear.add(vhdl.indent(1) + "check_passed(result(\"Write to Clear Test Pass.\"));")
        write_to_pulse.add(vhdl.indent(1) + "check_passed(result(\"Write to Pulse Test Pass.\"));")
        external_clear.add(vhdl.indent(1) + "check_passed(result(\"External Clear Test Pass.\"));")

        new_tb_code = testBenchCode.replace("--read_only_tag",read_only.code(4))
        new_tb_code = new_tb_code.replace("--read_write_tag",read_write.code(4))
        new_tb_code = new_tb_code.replace("--split_read_write_tag",split_read_write.code(4))
        new_tb_code = new_tb_code.replace("--write_to_clear_tag",write_to_clear.code(4))
        new_tb_code = new_tb_code.replace("--write_to_pulse_tag",write_to_pulse.code(4))
        new_tb_code = new_tb_code.replace("--external_clear_tag",external_clear.code(4))

        testbench.architecture.bodyCodeHeader.add(new_tb_code)

        testbench.write_file()