User Defined Primitives
这是一篇很浅显易懂的介绍Verilog UDP的文章,翻译过来留存,原文可参考这里。
l 介绍
Verilog有内建原语如门,传输管,开关等,这些都是相当小的原语,如果我们需要更为复杂的原语,verilog提供了UDP,也就是用户定义原语(User Defined Primitives). 使用UDP可以建模组合电路和时序电路。
l 语法
UDP以保留字primitive开始,以endprimitive结束,并紧接着原语的Ports/terminals。这与module的定义类似。UDP应该定义在module和endmoudle外面。


1 //This code shows how input/output ports
2 // and primitve is declared
3 primitive udp_syntax (
4 a, // Port a
5 b, // Port b
6 c, // Port c
7 d // Port d
8 );
9 output a;
10 input b,c,d;
11
12 // UDP function code here
13 endprimitive
在上面的语法中,udp_syntax是原语的名字,包含端口a,b,c,d。
l 端口
- 一个UDP只可以包含一个输出和最多10个输入。
- 输出端口应该是第一个端口,然后才是一个或多个输入端口。
- 所有的UDP都是标量,也就是,向量端口不允许。
- UDP不能是双向端口。
- 时序UDP的输出端需要额外声明为reg类型。
- 组合UDP的输出端声明为reg类型是非法的。
l 功能体
原语的功能(包括组合和时序)在一个table表里描述,以保留字endtable结束。如以下代码所示。对于时序UDP,我们可以使用initial 给输出赋一个初始值。


1 // This code shows how UDP body looks like
2 primitive udp_body (
3 a, // Port a
4 b, // Port b
5 c // Port c
6 );
7 output a;
8 input b,c;
9 // UDP function code here
10 // A = B | C;
11 table
12 // B C : A
13 ? 1 : 1;
14 1 ? : 1;
15 0 0 : 0