介绍
Verilog有内置的原语,如门、传输门和开关。这些都是比较小的单元,如果我们需要更加复杂的原语,Verilog提供了UDP(用户自定义原语)
UDP可以定义组合逻辑和时序逻辑
语法
primitive
开头,以endprimitive
结尾- 只能有一个输出端口
- 可以有多个输入端(最多十个?)
- UDP不能出现在
module...endmodule
中 - 输出端口必须在列表中的第一个
- 组合逻辑:输出端不能是reg
- 时序逻辑:输出端必须是reg
- UDP中所有的端口都是标量
组合逻辑
primitive or_gate(dout, a, b); //dout是输出端口,必须放在第一位
output dout; //输出端口
input a, b; //输入端口
table //这是一个 或门,UDP中逻辑关系出现在 table和endtable中
//B C :A
? 1 : 1;
1 0 : 1;
1 1 : 1;
0 0 : 0;
endtable
endprimitive
逻辑描述语句,要写在table
和endtable
之中,每一行代表一个case
在UDP中,不允许出现高阻态z
,其中?
和含义和x
一样,都表示不定态
时序逻辑
在时序中,输出端必须定义为reg
类型
在时序逻辑中,可以通过initial
给输出端赋值一个初始值
primitive dff (q, clk, d); //输出端口必须放在第一位
output q;
input clk, d;
reg q; //输出端必须是reg类型
table
//clk d : q(cur_state) : q(next_state)
0 1 ? : - ;
1 1 ? : 1 ;
1 0 ? : 0 ;
endtable
endprimitive
这是一个高电平触发的D触发器,-
表示次态无信号变化
在这个例子中,出现了两次:
- 左边的
:
,其左边代表输入端,右边代表输出端的现态 - 右边的
:
,其右边代表输出端的次态
在组合逻辑的例子中,因为没有涉及到输出与当前状态的关系,只出现了一次:
,左边是输入端,右边是输出端
再看一个上升沿触发的D触发器
primitive dff (q, clk, d);
output q;
input clk, d;
reg q;
table
//clk d : q(cur_state) : q(next_state)
00 1 ? : - ;
10 1 ? : - ;
01 0 ? : 0 ;
endtable
endtable
endprimitive
在table
中,不必列出所有的可能