Verilog语法(六)——常用原语及UDP

在Verilog中,原语是一种用于建立数字电路的基本构建块。它们是预定义的逻辑功能,可以直接用于电路设计中,而无需进一步的描述或定义。

以下是几个常用的Verilog原语及其用法:

  1. AND原语

AND原语实现了逻辑与运算。它通常采用以下方式使用:


and(out, in1, in2);

其中,out是输出信号,in1和in2是输入信号。这将创建一个逻辑与门,将in1和in2作为输入,并将结果存储在out中。

  1. OR原语

OR原语实现了逻辑或运算。它通常采用以下方式使用:


or(out, in1, in2);

其中,out是输出信号,in1和in2是输入信号。这将创建一个逻辑或门,将in1和in2作为输入,并将结果存储在out中。

  1. NOT原语

NOT原语实现了逻辑非运算。它通常采用以下方式使用:


not(out, in);

其中,out是输出信号,in是输入信号。这将创建一个逻辑非门,并将in的补码存储在out中。

  1. XOR原语

XOR原语实现了异或操作。它通常采用以下方式使用:


xor(out, in1, in2);

其中,out是输出信号,in1和in2是输入信号。这将创建一个异或门,将in1和in2作为输入,并将结果存储在out中。

除了以上列举的原语之外,Verilog还有很多其他的原语,如MUX、ADD、SUB等等,这些原语都是Verilog中常用的基本构建块,可以帮助设计者更快速、更方便地构建数字电路。

  1. UDP(user-defined primitive)

Verilog中的UDP(User-Defined Primitive)是一种自定义的数字逻辑原语,允许用户根据自己的需求创建新的模块。它可以用于实现特定的硬件功能或添加复杂的逻辑操作。

在使用UDP之前,您需要定义UDP的输入和输出端口。UDP支持以下类型的端口:

  • 输出端口:output

  • 输入端口:input

  • 双向端口:inout

下面是定义UDP的基本语法:


primitive udp_name (output output1, input input1, input input2, ...);
  // UDP code
endprimitive

UDP分为时序UDP和组合UDP两种(sequential UDP、combinational UDP),UDP可以直接通过真值表(table)的方式建模数字电路,下面是使用table构建2选1 mux的示例:


primitive mux2to1 (out, in0, in1, sel);
  output out;
  input in0, in1, sel;

  table
  // sel in1 in0 | out
    0   0   0  :  0
    0   0   1  :  0
    0   1   0  :  1
    0   1   1  :  1
    1   0   0  :  0
    1   0   1  :  1
    1   1   0  :  0
    1   1   1  :  1
  endtable
endprimitive

在table中可以使用的符号有:

symbol

interpretation

comments

0

逻辑0

1

逻辑1

x

unknow

不允许用于时序UDP的下一状态描述

?

0 or 1 or x

不允许用于output端

b

0 or 1

不允许用于output和时序逻辑的下一状态描述

-

no change

只允许用于output端和时序UDP

(vw)

change value v -> w

v和w是0 1 x z中的一个,只允许用于input端

*

与(??)相同

表示input端任意值的改变

r

与(01)相同

表述input的上升沿

f

(10)

表示input的下降沿

p

(01) or (0x) or (x1)

广义的input上升沿

n

(10) or (1x) or (x0)

广义的input下降沿

另外,在时序UDP中可以使用initial语法初始化output的值,示例如下:


primitive redge_dff(q, clk, data);
output q;
reg q;
input clk, data;
table
  // clk    data    q    q+
    //obtain output on rising edge of clock
    (01)    0    :   ?  :  0;
    (10)    1    :   ?  :  1;
    (0?)    1    :   1  :  1;
    (0?)    0    :   0  :  0;
    //ignore negative edge of clock
    (?0)    ?    :   ?  :  -;
    //ignore data changes on stady clock
    ?      (??)  :   ?  :  -;
endtable
endprimitive

不过,原语在实际使用中非常少见,所以本文只是对基本语法的一个介绍与归纳

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值