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-bound
和lower-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
用的比较多
.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