EXlif: Extended Logic Interchange Format Syntax(Describing Circuits for Forte)

exlif格式是对blif格式的拓展,可作为FORTE的输入文件格式
lif格式将组合电路表述成真值表
电路中每个内部信号,在blif格式中有对应的真值表、输入(fan in)和解析方程(resolution function)
在exlif格式中又增加了对时序逻辑元素的构造,如主从触发器(master slave flip-flops)
同时也增加了对结构层级、三状态驱动、各种类型的断言的构造

基本语法对象

空白(white space)

空格、tab、换行都是空白,除了真值表构造时需要考虑空白,其余都不要

注释(comments)

以#开头的行为注释行;
某行中,一个空格+一个#之后的剩余部分为注释

行延续(line continuation)

一行以双下划线(\)结尾,则该行与下一行视为同一行

节点名称(node names)

exlif格式大小写敏感
一个节点名称由base name组成、或者是一个quoted name

base name:包括除"="以外的非空白符,正则表达式为:[^\=\n\ \t][^\\\n\ \t\=]*
quoted name:由双引号括起来的任意字符序列
向量名:形如:base name[2], base name[3:2], base name [1:9], "a strange node name"[2:3]

模型名称

和节点名称类似,但不包括向量名

功能单元块(FUB,functional unit block)

一个功能单元块相当于Verilog里的一个模块(或VHDL中的一个实体Entity)
在EXLIF中的FUB:

.model FUB-name
<FUB interface template>
<declaration of signals>
<FUB body>
.end

一个EXLIF文件中可定义多个FUB
也可在一个FUB中定义另一个FUB
相当于是BLIF中模块,不需要先定义再使用

FUB解释

.model FUB-name 模型名称
.end模型终止标识符

<FUB interface template>
  • .input [inputs] 定义若干输入信号,形如:
.model sample
.inputs in1 in2

信号可以是标量(scalars)或者向量(vectors), 形如abc[12:10]定义一个大小为3的向量,具有的元素为abc[12], abc[11], abc[10]

  • .outputs [output]定义若干输出信号,形如:
.model sample
.outputs out1 out2

一个信号可以同时出现在输入和输出信号中,表示模型贯穿信号

  • .vector signal-name upper-bound lower-bound 表示signal-name是一个多位信号, 最高有效位和最低有效位分别用upper-boundlower-bound表示,都是整数。作为一种对于多位信号的缩写,在能够将这些信号显示指出来时,最好是显示指出,因此不推荐使用.vector
<declaration of signals> 模型属性(性质)
  • .attr name [attr-list] 用于指定FUBs、subFUBs和signals信号的属性。其中name代表FUBs、FUBs实例和signals的名称; [attr-list]表示一系列(属性名、属性值)对,每个元素形如attr-name=attr-value
    attr-name: 名称
    attr-value: 可以是string或者number
    如果某属性名没有对应的属性值,那该属性名需要用双引号括起来。
    attr-list 中必须有一个元素,无论是有属性值的属性还是没有属性值的属性(用双引号括起来)
    例,如下两个声明效果相同:
1. .attr x file=”foo.hdl”
.attr x line=”15”  # 对于同一FUB或signal可以有多行属性
2. .attr x file=”foo.hdl” line=”15”
<FUB body>主体定义
组合电路信号

有三种方式来定义组合电路信号的下一状态方程(next state function),分别是

  • .names
  • .expr
  • .bexpr
    其中.names用的比较多
  1. .names [inputs] output
    类似于BLIF中一样,对于若干二值输入和一个二值输出(‘-’表示don't care),定义一个真值表
    如果某个输入信号是vector,则输出信号也必须是同等大小的vector, 真值表也要做相应拓展
    例:
.names in1 in2 ... out
in1_value_1 in2_value_1 ... out_value_1
in1_value_2 in2_value_2 ... out_value_2

再例,一个二输入与门:

.names a b foo
11 1

一个二输入或门:

.names a b foo
00 0

或者,一个二输入或门:

.name a b foo
1- 1
-1 1

再例, 3个二输入与非门组成的电路:

.names a[2:0] b[4:2] res[12:10]
11 0

或者,定义为:

.names a[2] b[4] res[12]
11 0
.names a[1] b[3] res[11]
11 0
.names a[0] b[2] res[10]
11 0

如果,输出是一个vector,输入中存在数组,形如:

.names sel1 v1[3:0] v2[3:0] res[3:0]
11- 1
0-1 1

2..expr output = <expr> 将输入信号定义为输入信号的逻辑表达式,语法如下:

<expr> ::  <expr> & <expr>               AND
       ||  <expr> + <expr>               OR
       ||  <expr> ^ <expr>               XOR
       ||  <expr> '                      NOT
       ||  T true
       ||  F false
       ||  “vector_name[range1:range2]”  vector
       ||  scalar_name                   node name
       ||  ( <expr> )

优先级: ' > & >^ > +.

时序逻辑元件
  • .latch latch-input latch-output type control-signal [latch-control-list]: 定义一个存储单元,拥有一个输入和一个输出, latch-output的值是上一状态latch-input的值。latches和flip-flop没有初始值。
  • latch type : edge-sensitive或者level-sensitive, 形如:
    re control-signal: 指定该latch对于control-signal上升沿敏感
    fe control-signal: 指定该latch对于control-signal下降沿敏感
    ah control-signal: 指定该latch对于control-signal高电平敏感
    al control-signal: 指定该latch对于control-signal低电平敏感
    例:
.latch in1 out1 re clk
.latch in1 out1 fe clk
.latch in1 out1 ah clk
.latch in1 out1 al clk
  • latch control constructs: latch控制信号构造
    as: asynchronous set signal 异步设定信号
    ar: asynchronous reset signal 异步复位信号
    en: enable signal 使能信号
    例:
.latch in1 out1 re clk as=set ar=reset en=en1

以上语句定义一个latch,输入信号为in1,输出信号为out1,受clk信号的上升沿驱动,受到异步设定信号set和异步复位信号reset以及使能信号en1的驱动。

模型实例的嵌入(子模型?)

.subckt template-name instance-name [interface-list]定义一个实例化模型,其中template-name是该模型实例对应的模型名, instance-name是该模型实例的名称,interface-list类似于BLIF中一系列(实例信号,接口信号)对,列表元素形如:formal-name=actual-name

.nondet signal-name

定义一个非确定性的信号,亦即该信号拥有随机值

迁移关系的定义

.trans <transition-name> <signal-name> <transition-type>定义一个迁移关系,其中transition-name是该迁移的名称,signal-name是指该迁移描述的信号,transition-type是指迁移类型,目前包括:

“high-before”, “high-after”, “low-before”, “low-after”, “rise”, “fall” , “change”, “stable”.

Example

.model top
.inputs a b v1[2:0] v3[2:0] clk
.outputs out1 out2 vres[2:0]
.expr out1 = a & b
.expr “vres[2:0]” = “v1[2:0]” & a + “v2[2:0]”’
.names a b tmp
00 0
.subckt bar bar1 clk=clk in[1:0]=v1[2:1] out[1:0]=tmp2[1:0]
.subckt bar bar2 clk=clk in[1:0]=v3[1:0] out[1:0]=tmp3[1:0]
.names tmp2[1] tmp2[0] tmp3[1] tmp3[0] out2
11-- 1
--11 1
.end
.model bar
.inputs clk in[1:0]
.outputs out[1:0]
.latch in[1:0] out[1:0] re clk
.end
posted @ 2021-03-16 21:33  bacmive  阅读(187)  评论(0编辑  收藏  举报