一种面向软件开发的时钟树建模方法与流程

    专利2022-07-08  123


    本发明涉及软件开发技术领域,尤其是一种面向软件开发的时钟树建模方法。



    背景技术:

    时钟树又称时钟分布网络,包括从时钟源到达每个终端时钟的电路以及其中的部件。时钟源一般称为时钟根节点,终端时钟称为时钟叶节点,叶节点为芯片各部件提供时钟信号。时钟树相关的软件工具包括能耗评估软件、引导装载程序、时钟树配置工具、操作系统、板级支持包(bsp)等,均需要读取或者配置各部件的时钟频率。

    目前,硬件平台描述规范将工作频率视为硬件系统的重要元素。例如,多核联盟提出的shim规范使用operatingpointset罗列各组件可能的频率点;devicetree规范在cpu节点中使用clock-frequency和timebase-frequency描述cpu的工作频率。然而,二者都未建立时钟树模型,对需要对时钟树中各部件进行配置的软件缺乏支撑能力。

    此外,现代硬件平台中,为了在保证运算性能的前提下优化功耗,通常需要对主频和各组件频率进行动态调节,如果将每个频率或分频器配置都硬编码到软件中,会降低软件的可重用性。



    技术实现要素:

    针对现有软件开发过程中存在的时钟树描述问题,本发明提出一种面向软件开发的时钟树建模方法,通过该方法建立时钟树描述模型,为时钟树相关的软件开发提供统一的软硬件接口,缩短软件开发周期,提高软件可重用性。

    本发明保护一种面向软件开发的时钟树建模方法,包括以下步骤:

    步骤1,分析时钟树中的基本元素并进行抽象概括,基本元素包括时钟频率、分频器、倍频器和多路选择器;

    步骤2,分析时钟树中各基本元素之间的输入输出关系并进行抽象概括,输入输出关系包括直属父系关系;

    步骤3,按照基本元素构建不同集合,汇总时钟频率构建时钟集合,汇总分频器和倍频器构建分频器-倍频器集合,汇总多路选择器构建多路选择器集合,同类集合可嵌套;

    步骤4,建立最顶层集合,该集合包含1-m个时钟集合,0-n个分频器-倍频器集合,0-l个多路选择器集合,形成时钟树模型。

    进一步的,时钟频率至少包含name、id、frequency、frequencyunit的属性,其中name表示名称,id为全局唯一字符串,frequency表示时钟频率数值,frequencyunit表示时钟频率单位;分频器和倍频器至少包含name、id、value、type的属性,其中name表示名称,id为全局唯一字符串,value表示分频器或倍频器的取值,type为器件类型,即是倍频器或分频器;多路选择器至少包含name、id、value的属性,其中name表示名称,id为全局唯一字符串,value表示输出信号选择第几路输入信号。

    进一步的,各基本元素之间直属父系关系通过为基本元素增加直属父系属性来限定;对于时钟频率、分频器和倍频器,其直属父系仅有一个,通过增加parentref属性来限定,其中parentref的值为直属父系元素的id;对于多路选择器,其直属父系通常为2个,通过2个parentref属性来限定,2个parentref的值分别为其2个直属父系元素的id。

    通过本发明建立的时钟树模型中的基本元素既包括叶节点时钟的频率值,也包括时钟树中各电路器件的取值,因此既能支撑时钟树配置软件使用,也能作为完整硬件平台中的一个模块,提供各部件的工作频率;设计简洁统一,仅使用直属父系关系,完整描述时钟树中各组件的电路关系和逻辑关系,建立时钟树的拓扑结构。

    附图说明

    图1为时钟树的模型规范;

    图2为实施例2中实例图示;

    图3为实施例3中实例图示。

    具体实施方式

    下面结合附图和具体实施方式对本发明作进一步详细的说明。本发明的实施例是为了示例和描述起见而给出的,而并不是无遗漏的或者将本发明限于所公开的形式。很多修改和变化对于本领域的普通技术人员而言是显而易见的。选择和描述实施例是为了更好说明本发明的原理和实际应用,并且使本领域的普通技术人员能够理解本发明从而设计适于特定用途的带有各种修改的各种实施例。

    实施例1

    一种面向软件开发的时钟树建模方法,包括以下步骤:

    1、分析时钟树中的基本元素并进行抽象概括,仅从软件视角出发,抽象概括出的基本元素包括时钟频率、分频器、倍频器和多路选择器。

    时钟频率包括时钟源或参考时钟、pll输出时钟和各种终端时钟,本发明使用clock:<name,id,frequency,frequencyunit>描述,其中name表示名称,通常为便于识别的字符串,id为全局唯一字符串,frequency表示时钟频率数值,frequencyunit表示时钟频率单位,枚举包括khz、mhz、ghz。

    分频器是指使输出信号频率等于输入信号频率n分之一的电路,倍频器是指使输出信号频率等于输入信号频率m倍的电路,其中n和m通常为正整数。本发明使用multidivisor:<name,id,value,type>描述,其中name、id含义同上,value表示分频器或倍频器的取值,type为器件类型,枚举包括倍频器、分频器。

    多路选择器选择多个输入信号中的一个并输出该信号,本发明使用selector:<name,id,value>描述,其中name、id含义同上,value表示输出信号选择第几路输入信号。

    2、分析时钟树中各基本元素之间的输入输出关系并进行抽象概括,本发明使用直属父系关系表示各基本元素之间的输入输出关系。更直白的表达就是,若元素b是元素a的输出信号之一,则元素a为元素b的直属父系,对步骤1中定义的各基本元素模型中增加直属父系属性parentref。

    对于时钟,其直属父系仅有一个,且通常为分频器、倍频器或多路选择器。在时钟频率模型中增加直属父系属性,clock:<name,id,frequency,frequencyunit,parentref>描述,其中parentref的值为其直属父系的id。

    对于分频器或倍频器,其直属父系仅有一个,且通常为时钟、其他分频器或倍频器、多路选择器。在分频器和倍频器的模型中增加直属父系属性,multidivisor:<name,id,value,type,parenentref>,其中parentref的值为其直属父系的id。

    对于多路选择器,其直属父系通常有2个,且为时钟、分频器、倍频器、其他多路选择器。在多路选择器模型中增加直属父系属性selector:<name,id,value,no0parentref,no1parentref>,其中no0parentref的值为其第一个直属父系的id,no1parentref的值为其第二个直属父系的id,value=0表示选取no0parentref作为多路选择器的输出信号,value=1表示选取no1parentref作为多路选择器的输出信号。

    3、按照基本元素构建不同集合,汇总时钟频率构建时钟集合clockset,汇总分频器和倍频器构建分频器-倍频器集合multidivisorset,汇总多路选择器构建多路选择器集合selectorset,根据软件使用需求,同类集合可嵌套;再建立最顶层集合clocktree,该集合包含1-m个时钟集合clockset,0-n个分频器-倍频器集合multidivisorset,0-l个多路选择器集合selectorset,形成时钟树模型,如图1所示。

    本实施例使用xmlschema语言对时钟树模型进行形式化定义,针对具体的时钟树方案使用符合schema定义的xml文件进行描述,方便生成多种语言的类库,以便以对象方式访问模型中的基本元素及其属性,并且支持对时钟树的具体描述文件(即xml文件)进行有效性检查。

    实施例2

    下面结合图2举例说明如何建立符合时钟树模型规范的描述文件,以及时钟树配置软件使用该描述文件的方式。图2中pll输出时钟频率pll_clock等于参考时钟fref或等于fref/refdiv*fbdiv/postdiv1/postdiv2。容易看出,后者是由参考时钟fref经过1次倍频和3次分频得到的,根据实施例1所述时钟树建模方法,可得到如下xml形式描述。

    <clocktree>

    //构建时钟频率集合clockset,其中包含2个clock元素,分别为参考时钟refclock和pll输出时钟pll_clock

    //参考时钟频率为25mhz,其中pll输出时钟的的直属父系为一个旁路(多路)选择器selector_bypass_id。

    <clocksetclocksource="refclockset_id"name="pllclockset"id="pllclockset_id">

    <clockname="fref"id="refclock_id"parentref="refclock_id"

    frequencyunit="mhz"frequency="25"/>

    <clockname="pll_clock"id="pll_clock_id"parentref="selector_bypass_id"

    frequencyunit="mhz"frequency="1250"/>

    </clockset>

    //构建分频器-倍频器集合multidivisorset,其中包含1个倍频器pll_fbdiv,3个分频器pll_refdiv、

    //pll_postdiv1、pll_postdiv2,分频器pll_refdiv的直属父系为refclock,因此其输出为

    //refclock/pll_refdiv,倍频器pll_fbdiv的直属父系为pll_refdiv,因此其输出为

    //refclock/pll_refdiv*pll_fbdiv,分频器pll_postdiv1的直属父系为pll_fbdiv,因此其输出为

    //refclock/pll_refdiv*pll_fbdiv/postdiv1,分频器pll_postdiv2的直属父系为pll_postdiv1,因此其

    //输出为refclock/pll_refdiv*pll_fbdiv/postdiv1/postdiv2。

    <multidivisorsetname="multidivisorset_pll"id="multidivisorset_pll_id">

    <multidivisorname="pll_fbdiv"id="pll_fbdiv_id"type="multiplier"

    parentref="pll_refdiv_id"value="100"/>

    <multidivisorname="pll_refdiv"id="pll_refdiv_id"type="divisor"

    parentref="refclock_id"value="1"/>

    <multidivisorname="pll_postdiv1"id="pll_postdiv1_id"type="divisor"

    parentref="pll_fbdiv_id"value="2"/>

    <multidivisorname="pll_postdiv2"id="pll_postdiv2_id"type="divisor"

    parentref="pll_postdiv1_id"value="1"/>

    </multidivisor>

    //构建多路选择器集合selectorset,pll架构中仅含有一个多路选择器selectorby_pass,第一个直属父系为

    //参考时钟,第二个直属父系为分频器pll_postdiv2,即其输出为refclock或分频器pll_postdiv2的输出。

    <selectorset>

    <selectorname="selector-bypass"id="selector_pass_id"value="1"

    no0parentref="refclock_id"no1parentref="pll_postdiv2_id"/>

    </selecotrset>

    </clocktree>

    配置软件首先根据图2对应的描述方案获取基本元素以及元素之间的直属父系关系,接着根据模型中分/倍频器和多路选择器的语义建立参考时钟、分/倍频器、多路选择器之间的计算关系公式。用户既可以配置参考时钟、分/倍频器、多路选择器的数值自动获得输出时钟频率,也可以输入参考时钟频率和期待的输出时钟频率,通过一定算法来配置分/倍频器的取值。

    实施例3

    下面结合图3的时钟树方案,说明时钟集合嵌套的使用方法,分频器-倍频器集合和多路选择器集合嵌套的使用方法与之类似。假设软件需要对时钟频率按照时钟源分类,该例的描述方案将同一时钟源的时钟列入同一集合。

    <clocktree>

    //xxx_clockset为所有时钟频率构成的集合,其中包括1个参考时钟和5个嵌套的时钟频率子集合

    //分别为1个pll时钟集频率集合,pll0、pll1、pll2产生的时钟频率集合,以及1个外部时钟频率集合

    <clocksetname="xxx_clockset"id="xxx_clockset_id"clocksource="refclock_id">

    <clockname="refclock"id="refclock_id"parentref="refclock_id"

    frequencyunit="mhz"frequency="25"/>

    //pllclockset为3个pll时钟构成的时钟频率集合,其中每个时钟的直接时钟源均为参考时钟refclock

    <clocksetclocksource="refclock_id"name="pllclockset"id="pllclockset_id">

    <clockname="pll0"id="pll0_id"parentref="pll0_postdiv2_id"

    frequencyunit="mhz"frequency="500"/>

    <clockname="pll1"id="pll1_id"parentref="pll1_postdiv2_id"

    frequencyunit="mhz"frequency="1250"/>

    <clockname="pll2"id="pll2_id"parentref="pll2_postdiv2_id"

    frequencyunit="mhz"frequency="1200"/>

    </clockset>

    //clockset_src_pll0为由pll0产生的时钟频率集合,集合中每个时钟的直接时钟源均为pll0.

    <clocksetclocksource="pll0_id"name="clockset_src_pll0"id="clockset_0_id">

    <clockname="dsp_core_clock"id="dsp_core_clock_id"parentref="pll0_id"

    frequencyunit="mhz"frequency="500"/>

    <clockname="hb_clock"id="hb_clock_id"parentref="ahb_div_id"

    frequencyunit="mhz"frequency="250"/>

    </clockset>

    //clockset_src_pll1为由pll1产生的时钟频率集合,集合中每个时钟的直接时钟源均为pll1

    <clocksetclocksource="pll1_id"name="clockset_src_pll1"id="clockset_src_pll1_id">

    <clockname="paraport_clock"id="paraport_clock_id"parentref="paraport_div_id"

    frequencyunit="mhz"frequency="125"/>

    <clockname="uart_clock"id="uart_clock_id"parentref="uart_div_id"

    frequencyunit="mhz"frequency="50"/>

    <clockname="i2c_clock"id="i2c_clock_id"parentref="i2c_div_id"

    frequencyunit="mhz"frequency="125"/>

    <clockname="sensor_clock"id="sensor_clock_id"parentref="sensor_div_id"

    frequencyunit="khz"frequency="20"/>

    <clockname="pcie_pm_clock"id="pcie_pm_clock_id"parentref="pcie_pm_div_id"

    frequencyunit="mhz"frequency="25"/>

    <clockname="trace_axi_clock"id="trace_axi_clock_id"parentref="trace_axi_div_id"

    frequencyunit="mhz"frequency="625"/>

    </clockset>

    //clockset_src_pll2为由pll2产生的时钟频率集合,集合中每个时钟的直接时钟源均为pll2

    <clocksetclocksource="pll2_id"name="clockset_src_pll2"id="clockset_src_pll2_id">

    <clockname="ddr_phybp_clock"id="ddr_phybp_clock_id"parentref="pll2_id"

    frequencyunit="mhz"frequency="1200"/>

    <clockname="ddr_ctl_clock"id="ddr_ctl_clock_id"parentref="pll2_id"

    frequencyunit="mhz"frequency="600"/>

    </clockset>

    //clockset_outside为时钟树外部时钟集合

    <clocksetclocksource="rio1_ctl_clock_id"name="clockset_outside"

    id="clockset_outside_id">

    <clockname="rio1_ctl_clock"id="rio1_ctl_clock_id"parentref="rio1_ctl_clock_id"

    frequencyunit="mhz"frequency="125"/>

    </clockset>

    </clockset>

    </clocktree>

    显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域及相关领域的普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都应属于本发明保护的范围。


    技术特征:

    1.一种面向软件开发的时钟树建模方法,其特征在于,包括以下步骤:

    步骤1,分析时钟树中的基本元素并进行抽象概括,基本元素包括时钟频率、分频器、倍频器和多路选择器;

    步骤2,分析时钟树中各基本元素之间的输入输出关系并进行抽象概括,输入输出关系包括直属父系关系;

    步骤3,按照基本元素构建不同集合,汇总时钟频率构建时钟集合,汇总分频器和倍频器构建分频器-倍频器集合,汇总多路选择器构建多路选择器集合,同类集合可嵌套;

    步骤4,建立最顶层集合,该集合包含1-m个时钟集合,0-n个分频器-倍频器集合,0-l个多路选择器集合,形成时钟树模型。

    2.根据权利要求1所述的面向软件开发的时钟树建模方法,其特征在于,时钟频率至少包含name、id、frequency、frequencyunit的属性,其中name表示名称,id为全局唯一字符串,frequency表示时钟频率数值,frequencyunit表示时钟频率单位;

    分频器和倍频器至少包含name、id、value、type的属性,其中name表示名称,id为全局唯一字符串,value表示分频器或倍频器的取值,type为器件类型,即是倍频器或分频器;

    多路选择器至少包含name、id、value的属性,其中name表示名称,id为全局唯一字符串,value表示输出信号选择第几路输入信号。

    3.根据权利要求2所述的面向软件开发的时钟树建模方法,其特征在于,各基本元素之间直属父系关系通过为基本元素增加直属父系属性来限定。

    4.根据权利要求3所述的面向软件开发的时钟树建模方法,其特征在于,对于时钟频率、分频器和倍频器,其直属父系仅有一个,通过增加parentref属性来限定,其中parentref的值为直属父系元素的id;

    对于多路选择器,其直属父系有多个,通过增加多个parentref属性来限定,多个parentref分别为其多个直属父系元素的id。

    技术总结
    本发明提出一种面向软件开发的时钟树建模方法,通过本发明建立的时钟树模型中的基本元素既包括叶节点时钟的频率值,也包括时钟树中各电路器件的取值,因此既能支撑时钟树配置软件使用,也能作为完整硬件平台中的一个模块,提供各部件的工作频率;设计简洁统一,仅使用直属父系关系,完整描述时钟树中各组件的电路关系和逻辑关系,建立时钟树的拓扑结构;使用XML Schema技术定义时钟树模型,方便生成多种语言(如Java、C )的访问类,便于实际访问使用。

    技术研发人员:蔡顺
    受保护的技术使用者:安徽芯纪元科技有限公司
    技术研发日:2020.12.15
    技术公布日:2021.03.12

    转载请注明原文地址:https://wp.8miu.com/read-20183.html

    最新回复(0)