【无标题】

本文介绍了SystemVerilog(SV)的基本概念,它作为Verilog的升级版,提供了面向对象特性、高级抽象及更多的硬件描述功能。重点讨论了SV中的数据类型如logic、reg、wire,以及assign和always关键字的用法。SystemVerilog的这些特性在数字电路设计和验证中起着关键作用,使得复杂硬件设计和验证变得更加便捷。

sv数据类型

首先sv是什么

SV 是 SystemVerilog 的简称,它是一种硬件描述语言(HDL),是 Verilog HDL 的拓展,也可以说是 Verilog 的升级版。SV 可以在 Verilog 的基础上提供更多的面向对象特性和高级抽象特性,以支持系统级建模、可重用性设计等。

SystemVerilog 可以用于数字电路和芯片设计,还可以用于验证,即通过实现一个虚拟的芯片来验证设计的正确性。SV 的扩展包括了对类、包、接口、泛型、并行编程、断言和宏定义等方面的支持。

SystemVerilog 支持多态、泛型、类、接口和可重用的建模方法,这些都是面向对象编程中常用的概念。同时,SystemVerilog 还提供了数组、结构体、枚举等复杂数据类型,并支持各种运算符和表达式,可以轻松地完成更加复杂的硬件设计和验证任务。

另外,SystemVerilog 还增加了多种新的建模和验证语言特性,例如函数、任务、assertions、coverages 等,在设计验证方面提供了更好的支持。此外,SystemVerilog 的 DPI(Direct Programming Interface)机制使得它能够方便地与其他编程语言进行集成。

总之,SystemVerilog 是一种功能强大的硬件编程语言,它在硬件设计和验证领域得到了广泛应用,不仅在工业界被广泛使用,也在学术界得到了广泛的研究和探讨。

学sv的时候会有很多不懂得名词

比如:

assign,

always

logic

reg

wire

RTL,寄存器类型

学verilog,刚一开始就是什么空白符\b,注释符//这些.那其实如果用过C语言,这些基础的语法点应该是看一眼就知道了,但是问题是什么,是首先不知道这个Verilog是干啥的,其次完全不知道一段代码正常怎么写,assign是啥,always是啥,reg也会经常说到,10‘b101是啥都不知道,

8位寄存器:reg[7:0]qout(不用慌,后面都会知道)

你给他一段代码他能明白啥啊,就别说代码了,代码都不明白你告诉他,打代码的时候写注释用//。这不是开玩笑吗

书《Verilog HDL 数字集成电路设计原理与应用》

解释:

1.reg,RTL,寄存器

在 Verilog 中,reg 是一种数据类型,表示寄存器类型。与其他数据类型(如 wireinteger 等)不同的是,reg 表示的是一种可被赋值和存储的变量类型,通常用于存储特定的状态或数值。

reg 变量可以在模块中声明,在 always 块中使用。在 always 块中,reg 变量可以通过 blocking 或 non-blocking 赋值语句来进行赋值。由于 reg 变量的值可以被改变,因此通常用于描述状态机等逻辑电路中的状态寄存器。同时,也可以用于存储和传递小型数据。

需要注意的是,虽然 reg 表示的是寄存器类型,但实际上它并不一定对应到硬件电路中的物理寄存器。在综合时,reg 会被综合成为对应的逻辑电路,可能是一个 D 触发器、一个 mux 节点或一组 LUT 等。

在 Verilog 中,reg 和 RTL(Register-Transfer Level)都与寄存器相关,但它们表示的是不同的概念。

reg 表示的是一种数据类型,表示寄存器类型。它通常用于存储特定的状态或数值,可以在模块中声明,在 always 块中使用。由于 reg 变量的值可以被改变,因此通常用于描述状态机等逻辑电路中的状态寄存器。同时,也可以用于存储和传递小型数据。

而 RTL 是一种设计方法论,指的是通过将数字电路转化为多个阶段的信号传输和寄存器操作来进行设计。它是数字电路设计和验证的重要范式之一,也是硬件描述语言(如 Verilog、VHDL 等)的广泛应用。在 RTL 中,主要关注的是数据的传输和处理,而寄存器则用来存储中间结果,对于功能实现的细节并不过分关注。

因此,虽然 reg 变量和 RTL 都与寄存器相关,但它们所表达的概念不同。 reg 主要是一种数据类型,用于存储特定的状态或数值;而 RTL 则是一种设计方法,用于描述数字电路的结构和行为,其中寄存器仅用于存储中间结果。

2.assign,always

在 Verilog 中,assignalways 都可以用来定义模块中的逻辑行为。

assign 用于对组合逻辑进行建模,用于直接将表达式赋值给输出端口或中间信号,相当于连续赋值语句。它在模块实例化时即被求值,并在整个时间段内保持不变。简而言之,assign 可以理解为连续赋值,适用于无状态的、纯组合逻辑的场景。

例如,以下代码使用 assign 实现了一个 And 门的功能:

module and_gate(output out, input a, input b);
    assign out = a & b;
endmodule

上述代码表示了一个简单的 And 门模块,ab 为输入端口,out 为输出端口。使用 assign 直接将 ab 的值进行与操作,并将结果赋值给 out 变量,从而实现了 And 门的功能。

always 则用于对时序逻辑进行建模,在时钟触发时执行逻辑代码。它可以使用 blocking 或 non-blocking 赋值语句来更新变量的值,用于描述电路中各个寄存器之间的状态转移,以及时序逻辑的行为。简而言之,always 表示一种状态转移,适用于有状态、时序逻辑的场景。

例如,以下代码使用 always 实现了一个计数器的功能:

module counter(output reg [7:0] count, input clk, input rst);
    always @ (posedge clk or posedge rst) begin
        if (rst) begin
            count <= 8'h00;
        end else begin
            count <= count + 1;
        end
    end
endmodule

上述代码表示了一个简单的计数器模块,clkrst 为输入端口,count 为输出端口。使用 always 在时钟上升沿或复位上升沿触发时更新 count 的值,实现了计数器的功能。在 always 块中,通过 if 语句判断是否满足复位条件,如果满足就将计数器的值清零;否则每次更新计数器的值加一。

需要注意的是,在 Verilog 中,assignalways 都可以用来描述逻辑行为,但它们的作用不同,应根据具体场景选择使用哪种方式。

module and_gate(output reg out, input a, input b);
    always @ (a or b) begin
        out = a & b;
    end
endmodule

这段代码表示了一个 And 门的 Verilog 实现。out 为输出端口,ab 为输入端口,使用 reg 关键字声明 out 为寄存器类型。

always @(a or b) 表示 always 块的敏感列表中监测了输入变量 ab,当它们中的任意一个发生变化时,就会执行 always 块中的代码。该代码执行的具体内容为将输入端口 ab 的值进行逻辑与操作,并将结果赋值给 out 变量,从而实现了 And 门的功能。

需要注意的是,在 SystemVerilog 中使用 always 时,应该遵循一些规则和最佳实践,如避免嵌套、使用非阻塞赋值、减少敏感列表长度,以保证代码的可读性和可维护性。此外,如果设计的逻辑比较复杂,建议使用面向对象编程的方式,使用类和方法等高级特性来构建模块,可以使代码更加清晰易懂。

在 SystemVerilog 中,always 是用于表示行为描述(Behavioral Modeling)的关键字。行为描述可以理解为一段程序代码,描述了数字电路的行为,即在输入信号的变化下,输出信号如何随之变化。在 SystemVerilog 中,always 块可以被用来实现不同类型的行为描述,如组合逻辑、时序逻辑等。

以下是 always 语句的一般形式:

always @ (sensitivity_list)
begin
    // 这里放置需要描述的行为代码
end
其中,sensitivity_list 是敏感列表,它包含着 always 块需要监测变化的变量,这些变量发生改变时,就会触发 always 块中的代码执行。例如:

always @ (a, b)
begin
    c = a & b;
end

上述代码表示一个与门,当输入端口 ab 发生变化时,就会计算逻辑与操作,并将结果赋值给 c

需要注意的是,在 SystemVerilog 中,行为描述代码的执行顺序是并行执行的,因此需要特别注意时序逻辑的描述,避免出现问题。此外,在使用 always 时,应该遵守基本的规则和最佳实践,例如避免嵌套、减少敏感列表长度、使用非阻塞赋值等。

3.logic

在 SystemVerilog 中,logic 是一种用于表示逻辑类型的数据类型。它是一种 4-state 的类型,可以代表四种不同的逻辑值:0、1、Z(高阻态)和 X(未定义)。与 bit 类型相比,logic 类型可以更好地处理多态和附加信息。

在上面的代码中,input logic a, b 表示 ab 两个输入端口是逻辑类型的,它们可以取 4 种不同的逻辑值。而 output logic c 则表示输出端口 c 是逻辑类型的,在本例中它将表示逻辑与操作的结果。

需要注意的是,SystemVerilog 中的 logic 数据类型是 IEEE-1364 标准所引入的,只能在 SystemVerilog 中使用,而不能在 Verilog 中使用。如果使用 Verilog 编写代码,则需要使用 regwire 等其他类型来表示信号或端口的数据类型。

4.硬件描述语言HDL,通过对数字电路和系统的语言描述,可以对数字集成电路进行设计和验证。

现在最常用的两种硬件描述语言:VerilogHDL,VHDL,他们都可以设计和验证超大规模数字集成电路。

下面是组合逻辑电路原理图设计(数电)和Verilog HDL描述对比

4位总线与逻辑

原理图:

 Verilog

 32位总线与逻辑

原理图

 verilog:

 区别只是把3换成31

 发现这里面除了一些数字改变,其他代码基本没变

而这些数字的意思是:

其中,b 表示的是二进制,即基数为 2 的数字表示方式;

o 表示的是八进制,即基数为 8 的数字表示方式;

d 表示的是十进制,即基数为 10 的数字表示方式;

而 h 或 H 表示的是十六进制,即基数为 16 的数字表示方式。

在四值电平逻辑中,x就是不确定的意思。

例如,二进制数 1011 可以用 2'b1011 表示,八进制数 137 可以用 8'o137 表示,十进制数 25 可以用 25d  表示。

3'b0x1是一个 Verilog HDL 中的数字字面值,其中:

3'b 表示这是一个 3 位的二进制数字。

0 表示最高位为 0。

x 表示中间一位为不确定的值(即可能为 0 或 1)。

1 表示最低位为 1。

因此,3'b0x1 可以转换为二进制数 001 或 011,其中中间一位的值是不确定的,可能为 0 也可能为 1。在 Verilog HDL 中,使用这种数字字面值可以方便地表示带有不确定位(如 X 或 Z)的二进制数字,例如用于测试和仿真等场合。

[]:在 Verilog HDL 中,用 [ ] 括起来的数字表示的是位宽(bit-width),即该信号能够表示的二进制数字的位数。其中,用冒号 : 分隔的两个数字表示这个信号的位宽范围。

举个例子,如果一个信号的位宽为[7:0],则它可以表示8个比特(bits)的二进制数字,从最高位(MSB)到最低位(LSB)依次排列,即[7][6][5][4][3][2][1][0]。

同理,如果一个信号的位宽为[2:0],则它可以表示3个比特的二进制数字,从最高位(MSB)到最低位(LSB)依次排列,即[2][1][0]。因此,只需要考虑每个比特上的取值,就可以得到该信号可以表示的所有可能数字的数量。在这个例子中,总共有 23=823=8 种可能数字的组合,分别是000、001、010、011、100、101、110和111。

因此,[2:0] 表示3个比特或3位的位宽范围,这种表示方法在硬件设计中非常常见,方便描述各种数字信号的位宽和取值范围。

wire [2:0]c;

用于声明一个名为 c 的线网(wire),[2:0] 表示 c 变量可以被划分成三个部分,其中 [2] 表示最高位(MSB),[0] 表示最低位(LSB),[1] 表示中间一位。因此,c 变量可以表示 2^3=8 种可能的值,即 {c[2], c[1], c[0]} 可取的所有二进制数的组合,从 000 到 111。

数电,都在说什么模拟信号是区别于数字信号,数字信号是离散的,模拟信号是连续的。但是也不是听不懂而是不知道说这个有啥用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值