stanford-oval/wikipedia huggingface dataset:
Verilog
语言要素 > 基本规范 > 大小写敏感性

Verilog是一种大小写敏感的硬件描述语言。其中，它的所有系统关键字都是小写的。
语言要素 > 基本规范 > 标识符及保留字

Verilog代码中用来定义语言结构名称的字符称为标识符，包括变量名、端口名、模块名等等。标识符可以由字母、数字、下划线以及美元符（$）来表示。但是标识符的第一个字符只能是字母、数字或者下划线，不能为美元符，这是因为以美元符开始的标识符和系统任务的保留字冲突。
和其他许多编程语言类似，Verilog也有许多保留字（或称为关键字），用户定义的标识符不能够和保留字相同。Verilog的保留字均为小写。变量类型中的wire、reg、integer等、表示过程的initial、always等，以及所有其他的系统任务、编译指令，都是关键字。可以查阅官方文献以完整的关键字的列表。
语言要素 > 基本规范 > 转义标识符

转义标识符（又称转义字符），是由\开始，以空白符结束的一种特殊编程语言结构。这种结构可以用来表示那些容易与系统语言结构相同的内容（例如"在系统中被用来表示字符串，如果字符串本身的内容包含一个与之形式相同的双引号，那么就必须使用转义标识符）。下面列出了常用的几种转义标识符。除此之外，在反斜线之后也可以加上字符的ASCII，这种转义标识符相当于一个字符。常用的转义标识符有\n（换行）、\t（制表位）、\b（空格）、\\（反斜杠）和\"（英文的双引号）等。
语言要素 > 数据类型 > 四值逻辑

| --- | --- |
 逻辑值及其解释 0：逻辑低电平，条件为假  1：逻辑高电平，条件为真  z：高阻态，浮动  x：未知逻辑电平  :  信号强度（从强到弱）及其属性 supply：驱动  strong：驱动  pull：驱动  large：存储  weak：驱动  medium：存储  small：存储  highz：高阻态  
上面列出了Verilog采用的具有八种信号强度的四值逻辑（four-valued logic），数字电路中的信号可以用逻辑值、信号强度加以描述。当系统遇到信号之间的竞争时，需要考虑各组信号的状态和强度。如果驱动统一线网的信号强度不同，则输出结果是信号强度高的值；如果两个强度相同的信号之间连接到同一个线网，将会发生竞争，结果为不确定值x。
语言要素 > 数据类型 > 线网与寄存器

Verilog所用到的所有变量都属于两个基本的类型：线网类型和寄存器类型。
线网与我们实际使用的电线类似，它的数值一般只能通过连续赋值（continuous assignment），由赋值符右侧连接的驱动源决定。线网在初始化之前的值为x（trireg类型的线网是一个例外，它相当于能够储存电荷的电容器）。如果未连接驱动源，则该线网变量的当前数值为z，即高阻态。线网类型的变量有以下几种：wire、tri、wor、trior、wand、triand、tri0、tri1、supply0、supply1、trireg，其中wire作为一般的电路连线使用最为普遍，而其他几种用于构建总线，即多个驱动源连接到一条线网的情况，或搭建电源、接地等。当进行模块的端口声明时，如果没有明确指出其类型，那么这个端口会被隐含地声明为wire类型。因此，在声明输出端口时应该注意是否有必要加上reg关键字。以下面的代码片段为例：
module my_moule (out1, out2, in1, in2); //该模块具有两个输出端口
  output reg out1; //out1端口被声明为为reg类型，它可以保存当前值
  output out2; //out2端口隐含地被声明为为wire类型，它的数值必须依赖连续赋值语句维持
endmodule
寄存器与之不同，它可以保存当前的数值，直到另一个数值被赋值给它。在保持当前数值的过程中，不需要驱动源对它进行作用。如果未对寄存器变量赋值，它的初始值则为x。Verilog中所说的寄存器类型变量与真实的硬件寄存器是不同的，它是指一个储存数值的变量。如果要在一个过程（initial过程或always过程）里对变量赋值，这个变量必须是寄存器类型的。寄存器类型的变量有以下几种：reg（普通寄存器）、integer（整数）、time（时间）、real（实数），其中reg作为一般的寄存器使用最为普遍。利用寄存器变量的数组，还可以对ROM进行建模。
关于选择线网类型还是寄存器类型，需要符合一定的规定。模块的输入端口可以与外界的线网或寄存器类型的变量连接，但是这个模块输出端口只能连接到外界的线网。再简单点，就是在两个模块的信号连接点，提供信号的一方可以是寄存器或者线网，但是接受信号的一方只能是线网。此外，在initial、always过程代码块中赋值的变量必须是寄存器类型的，而连续赋值的对象只能是线网类型的变量。
语言要素 > 数据类型 > 数字的表示

在Verilog里，当一个变量的类型确定，即已经知道它是寄存器类型或者是线网类型，当把具体的数值赋值给它时，需要利用下面所述的数字表示方法。数字表示的基本语法结构为<位宽>'<数制的符号><数值>。其中，位宽是与数据大小相等的对应二进制数的位数加上占位所用0的位数，这个位数需要使用十进制来表示。位宽是可选项，如果没有指明位宽，则默认的数据位宽与仿真器有关（最小32位）；数制需要用字母来表示，h对应十六进制，d对应十进制，o对应八进制，b对应二进制。如果没有指明数制，则默认数据为十进制数。例如：
233：十进制数233（未指明位宽）
12'h123：十六进制数123（使用12位）
20'd44：十进制数44（使用20位，高位自动使用0填充）
4'b1010：二进制数1010（使用4位）
6'o77：八进制数77（使用6位）
-233：十进制数-233（未指明位宽）
-32'd3: 十进制数-3 (使用32位)
32'hfffffffd: 十六进制数fffffffd (使用32位)
如果某个数的最高位为x或z，那么系统会自动使用x或z来填充没有占据的更高位。如果最高位为其他情况，系统会自动使用0来填充没有占据的更高位。
语言要素 > 数据类型 > 向量

向量形式的数据是Verilog相对C语言较为特殊的一种数据，但是这种数据在硬件描述语言中十分重要。在Verilog中，标量的意思是只具有一个二进制位的变量，而向量表示具有多个二进制位的变量。如果没有特别指明位宽，系统默认它为标量。
在真实的数字电路，例如将两个四位二进制数相加的进位加法器中，我们可以发现，其中一个数是通过四条电线（每条线表示四位中的某一位）连接到加法器上的。我们可以用一个向量来表示这个多位数，分别用这个向量的各个分量来表示“四条电线”，即四位中的某一位。这样做的好处是，可以方便地在Verilog代码的其他地方选择其中的一位（位选）或多位（域选）。当然，如果没有进行位选或域选，则这个多位数整体被选择。
向量的表示需要使用方括号，方括号里的第一个数字为向量第一个分量的序号，第二个数字为向量最后一个分量的序号，中间用冒号隔开。向量分量的序号不像C语言的数组一样必须从0开始，不过为了和数字电路里二进制数高低位的表示方法一致，我们常常让最低位为0（即对于四位二进制数，其最高位为第3位，次高位为第2位，次低位为第1位，最低位为第0位），当然这只是一种习惯。例如，上面提到的四位二进制数用向量表示为：
wire [3:0] input_add; //声明名为input_add的4位wire型向量
wire [4:1] input_add1; //也是4位wire型向量，但是分量序号从4到1
wire [0:3] input_add2; //也是4位wire型向量，但是分量序号从0到3
上面的向量声明之后，我们就可以方便地选择其中的某几个分量进行操作。请注意用于域选的方括号的位置在向量名称之后，方括号内的数字为所需的位数。例如我们可以进行以下操作：
input_add [3] = 1'b1; //将1赋值给input_add向量的第三位（最高位）
input_add [1:0] = 2'b01; //将0和1分别赋值给input_add向量的第1、0位（最低两位）
当对向量进行赋值时，如果右边的数值位宽大于左边的变量，则多出来的位被丢弃；如果右边的数值位宽小于左边的变量，则不够的位用0填补。
语言要素 > 数据类型 > 数组

Verilog中的几种寄存器类型的数据，包括reg、integer、time、real，以及由这几种数据构成的向量，都可以构成数组。声明数组时，方括号位于数组名的后面，括号内的第一个数字为第一个元素的序号，第二个数字为最后一个元素的序号，中间用冒号隔开。如果数组是由向量构成的，则数组的其中某个元素是向量。同样，出于习惯考虑，我们一般让数组第一个元素的序号为0，后面元素的序号依次递增。此外，和C语言类似，用户可以声明多维数组。例如：
integer number [0:100]; //声明一个有101个元素的整数数组
number [25] = 1234; //将1234赋值给25号（第26个）元素
reg [7:0] my_input [65535:0]; //声明一个有65536个元素的8位向量寄存器
my_input [97] = 8'b10110101; //将10110101分别赋值给97号（第2个）元素的7至0位
reg my_reg [0:3][0:4]; //声明一个具有20个元素的二维寄存器数组
my_reg [1][2] = 1'b1; //将1赋值给上述二维数组的第2行、第3列元素
由于数组和向量的表示都使用了方括号，因此使用时需要注意这个变量或向量的名称在最初被声明为何种类型的数据。上面第三行的例子是65536个8位向量组成的向量数组，它可以描述一个64KB的存储器。
表示数组某个元素时，允许使用变量来表示元素的索引（如number [i] = 1234;），但是表示一个向量的一位或者几位时，只允许使用数字来表示位的索引；此外，使用数组时一次只能对一个元素进行操作，而不能向向量那样同时对连续的几个位进行操作，例如my_input [65535][7:4] = 4'b1010;将一个四位二进制数赋值给第65536个元素的高四位。
语言要素 > 数据类型 > 参数

可以通过parameter关键字声明参数。参数与常数的意义类似，不能够通过赋值运算改变它的数值。在模块进行实例化时，可以能够通过defparam，即参数重载语句块来改变模块实例的参数。另一种方法是在模块实例化时，使用#()将所需的实例参数覆盖模块的默认参数。局部参数可以用localparam关键字声明，它不能够进行参数重载。
在设计中使用参数，可以使得模块代码在不同条件下被重复利用，例如四位数全加器和十六位数全加器可以通过参数实例化同一个通用全加器模块。
语言要素 > 数据类型 > 字符串

Verilog中的字符串总体来说与C语言中的字符串较为类似，其中每个字符以ASCII表示，占8位。字符串存储在位宽足够的向量寄存器中。字符串中的空格、换行等特殊内容，以转义标识符（参见前面提到过的转义标识符）的形式表示。
语言要素 > 流程控制

为了使设计人员方便地使用寄存器传输级描述，Verilog提供了多种流程控制结构，包括if、if...else、if...else if...else等形式的条件结构，case分支结构，for、while循环结构。这些流程控制结构与C语言有着相似的用法。不同的循环结构可能造成不同的逻辑综合结果。Verilog也提供了一些C语言中没有的流程控制结构以适应硬件描述语言的需要，例如casex、casez两种选择结构，前者可以条件数值中的x、z均作为无关值，后者仅将z作为无关值；此外还提供了forever、repeat两种循环结构，分别用于无限循环和指定次数循环。数字电路的逻辑功能描述常常使用到这些流程控制结构，例如，case结构可以清晰地描述一个数据选择器。
语言要素 > 运算符

Verilog的许多运算符和C语言类似，但是有一部分运算符是特有的，例如拼接运算符、缩减运算符、带有无关位的相等运算符等。
按位
按位取反（~）：1个多位操作数按位取反。例如：a=4'b1011，则~a的结果为4'b0100
按位与（&）：2个多位操作数按位进行与运算，各位的结果按顺序组成一个新的多位数。例如：a=2'b10，b=2'b11，则a&b的结果为2'b10
按位或（|）：2个多位操作数按位进行或运算，各位的结果按顺序组成一个新的多位数。例如：a=2'b10，b=2'b11，则a|b的结果为2'b11
按位异或（^）：2个多位操作数按位进行异或运算，各位的结果按顺序组成一个新的多位数。例如：a=2'b10，b=2'b11，则a^b的结果为2'b01
按位同或（~^或^~）：2个多位操作数按位进行同或运算，各位的结果按顺序组成一个新的多位数。例如：a=2'b10，b=2'b11，则a~^b的结果为2'b10
逻辑
逻辑取反（!）：对1个操作数进行逻辑取反，如果这个操作数为0，则结果为1；如果这个操作数不为0，则结果为0
逻辑与（&&）：对2个操作数进行逻辑与，如果二者同不为0，则结果为1，否则为0。例如：3 && 0的结果为0。
逻辑或（||）：对2个操作数进行逻辑或，如果二者其中至少有一个不为0，则结果为1，否则为0。例如：3||0的结果为1。
缩减
缩减与（&）：对一个多位操作数进行缩减与操作，先将它最高位与次高位进行与操作，其结果再与第二次高位进行与操作，直到最低位。例如：&(4'b1011)的结果为0
缩减与非（~&）：对一个多位操作数进行缩减与非操作，先将它最高位与次高位进行与非操作，其结果再与第二次高位进行与非操作，直到最低位。例如：~&(4'b1011)的结果为1
缩减或（|）：对一个多位操作数进行缩减或操作，先将它最高位与次高位进行或操作，其结果再与第二次高位进行或操作，直到最低位。例如：|(4'b1011)的结果为1
缩减或非（~|）：对一个多位操作数进行缩减或非操作，先将它最高位与次高位进行或非操作，其结果再与第二次高位进行或非操作，直到最低位。例如：~|(4'b1011)的结果为0
缩减异或（^）：对一个多位操作数进行缩减异或操作，先将它最高位与次高位进行异或操作，其结果再与第二次高位进行异或操作，直到最低位。例如：^(4'b1011)的结果为1
缩减同或（~^or^~）：对一个多位操作数进行缩减同或操作，先将它最高位与次高位进行同或操作，其结果再与第二次高位进行同或操作，直到最低位。例如：~^(4'b1011)的结果为0
算术
加（+）：2个操作数相加
减（-）：2个操作数相减或取1个操作数的负数（二进制补码表示）
乘（*）：2个操作数相乘
除（/）：2个操作数相除
求幂（**）}}：2个操作数求幂，前一个操作数为底数，后一个操作数为指数
关系
大于（>）：比较2个操作数，如果前者大于后者，结果为真
小于（<）：比较2个操作数，如果前者小于后者，结果为真
大于或等于（>=）：比较2个操作数，如果前者大于或等于后者，结果为真
小于或等于（<=）：比较2个操作数，如果前者小于或等于后者，结果为真
逻辑相等（==）：2个操作数比较，如果各位均相等，结果为真。如果其中任何一个操作数中含有x或z，则结果为x
逻辑不等（!=）：2个操作数比较，如果各位不完全相等，结果为真。如果其中任何一个操作数中含有x或z，则结果为x
case相等（===）：2个操作数比较，如果各位（包括x和z位）均相等，结果为真
case不等（!==）：2个操作数比较，如果各位（包括x和z位）不完全相等，结果为真
移位
逻辑右移（>>）：1个操作数向右移位，产生的空位用0填充
逻辑左移（<<）：1个操作数向左移位，产生的空位用0填充
算术右移（>>>）：1个操作数向右移位。如果是无符号数，则产生的空位用0填充；有符号数则用其符号位填充
算术左移（<<<）：1个操作数向左移位，产生的空位用0填充
拼接（{,}）：2个操作数分别作为高低位进行拼，例如：{2'b10,2'b11}的结果是a'b1011
重复（{n{m}}）：将操作数m重复n次，拼接成一个多位的数。例如：A=2'b01，则{2{A}}的结果是4'b0101
条件（?:）：根据？前的表达式是否为真，选择执行后面位于:左右两个语句。例如：(a>b)?(a=a-1):(b=b-2)，如果a大于b，则将a-1的值赋给a，否则将b-2的值赋给b
语言要素 > 系统任务

系统任务可以被用来执行一些系统设计所需的输入、输出、时序检查、仿真控制操作。所有的系统任务名称前都带有美元符号$使之与用户定义的任务和函数相区分。例如，$display用于显示指定的字符串，然后自动换行（用法类似C语言中的printf函数）；$monitor用于监视变量，一旦被监视的变量发生变化，会显示指定的字符串；而$time可以提取当前的仿真时间。完整的列表请查阅参考工具、Verilog手册或标准文档。
语言要素 > 编译指令

Verilog具有一些编译指令，它们的基本格式为`<keyword>，注意第一个符号不是单引号，而是键盘上数字1左边那个键对应的撇号。常用的编译指令有文本宏预定义`define、`include，它们的功能与C语言中类似，分别提供文本替换、文件包含的功能。Verilog还提供了`ifdef、`ifndef等一系列条件编译指令，设计人员可以使得代码在满足一定条件的情况下才进行编译。此外，`timescale指令可以对时间单位进行定义。详细的编译指令清单请参阅相关参考书籍。
寄存器传输级描述

参见：寄存器传输级
寄存器传输级描述 > 两种过程

在Verilog中，可以声明两种不同的过程：always过程和initial过程。过程可以是包含时序的过程描述，而不包含时序的过程还可以表达组合逻辑。always过程从关键字always开始，可以连续多次运行，当过程的最后一行代码执行完成后，再次从第一行代码开始执行。如果没有使用系统任务$finish，always过程将不断循环执行。initial过程从关键字initial开始，它只能执行一次。
一个模块中可以包含多个过程，各个过程相互之间是并发执行的。不过，过程不能够嵌套使用。如果过程中有多个语句，则需要使用关键字begin、end或fork、join将它们组成一个代码块。这两种关键字组合代表着顺序代码块和并行代码块，后面的部分会讲述这两种结构。
例如，利用always过程循环执行的特点，可以为模块提供一个时间脉冲（注意第一个initial过程为时钟的初始化，这个过程只需要进行一次）：
initial
  a = 1'b0;
always
  #1 a=~a;
end
虽然，always代码块和while语句、forever语句都能提供循环功能，但是always代码块的循环更侧重过程的循环执行，而后二者更侧重代码的循环执行。因此，为了使代码更具条理，过程的循环应当用always语句描述。当然，在实际使用过程中，强制使用其中的某一种在功能实现上都是可行的。
寄存器传输级描述 > 寄存器变量的过程赋值

在Verilog中，有两种赋值运算，一种叫做阻塞赋值（blocking assignment），其运算符为=；另一种叫做非阻塞赋值（non-blocking assignment），其运算符为<=。在顺序代码块中使用阻塞赋值语句，如果这一句没有执行完成，那么后面的语句不会执行；如果在顺序代码块中使用非阻塞赋值，则执行这一句的同时，并不会阻碍下一句代码的执行。而且，如果后一个语句涉及前面一个非阻塞赋值语句中的变量，由于这两个语句“同时”执行，因此后一个语句所用到的是前面一个语句执行前变量的数值。非阻塞赋值是Verilog作为硬件描述语言与普通编程语言的一个重大区别。
带有两个触发器输出端的简单示例如下
always @ (posedge reset or posedge clock)
begin
  a <= b;
  b <= a;
end
endmodule
上面的例子如果没有使用非阻塞赋值，而使用阻塞赋值，那么flop1和flop2的数值就不能被交换。flop1和flop2在执行完毕后的数值都与之前flop2的数值相同。在传统的编程语言中，可能需要一个临时的变量，或者使用指针，才能够达到交换两个变量的目的。这里使用了非阻塞赋值，相当于引入了一个隐含的临时变量。第二个非阻塞赋值右边的a是第一句赋值之前的数值，变量交换的目的得以实现。信号边缘敏感的过程语句块内常使用非阻塞赋值，使语句块的诸赋值语句同时进行，虽然功能上似乎可以用阻塞赋值实现，但是仿真时会产生不正常的结果。
通常的过程赋值语句往往只有在触发或循环等情况，即赋值语句被执行到时候，才会使左边的寄存器变量改变一次；而线网变量的连续赋值则一直“监视”右边表达式的变化，一旦其结果发生变化，立即会左边的线网变量更新为此结果。如果需要对寄存器变量进行过程连续赋值，则可以使用Verilog提供的assign或force关键字“强制地”将赋值运算符右边表达式的结果连续不断地施加在左边的寄存器变量上。
寄存器传输级描述 > 线网变量的连续赋值

对线网类型变量的连续赋值是数字电路数据流建模的重要步骤，数字系统不含时序的组合逻辑部分可以使用线网的连续赋值描述。线网不能够像寄存器那样储存当前数值，它需要驱动源提供信号，这种驱动是连续不断的，因此线网变量的赋值称为连续赋值，这与寄存器变量在过程中的单次赋值不同，而且所用的运算符也有区别。在Verilog里，线网连续赋值的关键字为assign，下面为一个例子：
module and
wire out;
wire in1, in2;
assign out = in1 & in2;
在这个例子中，线网变量out在系统运行过程中总为两个输入线网变量in1和in2逻辑与的结果。
线网的连续赋值可以在关键字assgin附加延迟信息，例如上面的代码可以改为：
assign #5 out = in1 & in2; //in1和in2逻辑与的结果在5个时间周期后才施加在out上
寄存器传输级描述 > 时序控制

参见：时序逻辑电路
Verilog能够描述过程中的时序特性，这也是硬件描述语言与普通计算机编程语言的重要差别之一。过程的时序控制可以通过三种方式实现：延迟时序控制、事件时序控制以及电平敏感时序控制。
过程中的时序控制可以控制代码的执行时间。在Verilog中，除了过程中的时序控制，还可以定义元件、路径的延迟。这些延迟请参见本条目后面有关逻辑门级延迟的部分。
寄存器传输级描述 > 时序控制 > 延迟时序控制

在代码中使用关键字#和延迟的时间，就可以通过延迟来进行时序控制。延迟的时间可以是数字、变量或者表达式。延迟时序控制又分为两种：常规延迟和内嵌延迟。
常规延迟在赋值语句的左边，系统执行到这一行代码时，系统先进行延迟，延迟完成后，再计算表达式，并将结果赋值给左边的变量；而内嵌延迟在赋值语句的右边，系统执行到这一行代码时，系统先立即计算表达式，再进行延迟，最后把表达式的结果赋值给左边的变量。在上述两种延迟方式中，设计人员需要注意表达式的自变量在延迟过程中可能发生变化。常规延迟是先延迟再计算表达式，这时表达式的自变量可能已经发生了变化；而内嵌延迟在延迟前就已经进行了计算，表达式的自变量在延迟过程中发生的变化，对已经计算的表达式结果没有影响，延迟只是指这个结果需要等待一段时间再赋值给左边的变量。
下面的代码片段分别展示了常规延迟和内嵌延迟：
parameter latency = 8;
initial
begin
  x = 1;
  y = 2;
  #5 x = 3; //使用常规延迟：等待5个系统周期后对x赋值
  #latency y = 4; //使用变量进行常规延迟，再等待8个系统周期后对y赋值
  z = #10 (x+y); //使用内嵌延迟：先用当前时刻的x、y数值计算(x+y)，再等待10个系统周期后对z赋值
end //z的最终数值为7
在顺序语句块（begin...end）中，由于语句是从上到下、一行一行地执行，而所有常规延迟时间都是实际执行时间相对于这一句本来应该开始执行的时间（也是上一句执行完成之时）的延迟值。因此，在上面的代码示例中，对变量y的赋值时间相对于上一句结束延迟了8个系统周期，而上一句相对系统零时刻已经延迟了5个系统周期，因此对y的赋值发生在第13个系统周期。不过，如果顺序语句块中存在非阻塞赋值，由于这个结构有着类似并行语句块的特点，因此需要特别考虑。
在并行语句块（fork...join）中，由于所有语句都是并发执行的，而所有常规延迟时间都是实际执行时间相对于这一句本来应该开始执行的时间（也是系统零时刻）的延迟值，因此各个常规延迟所指的时间都是相对于系统零时刻。
寄存器传输级描述 > 时序控制 > 事件时序控制

事件时序控制的意思是，如果指定的事件发生，则代码被触发执行。它的关键字为@，后面可以加变量或者事件名称。参见下面的例子：
@(clk) x = 1; //当变量clk发生变化，则将1赋值给x
@(posedge clk) y = 2; //在变量clk的上升沿，将2赋值给y
z = @(negedge clk) (x+y); //先立即计算表达式(x+y)，然后在变量clk下降沿，将表达式的结果赋值给z
上面@后面括号里的是常规事件。Verilog允许设计人员通过关键字event和触发符号->定义自己所需要的命名事件触发：
event bigger_than_two;
always @(posedge clock)
begin
  if(a > 2)
  ->bigger_than_two; //如果a大于2，则事件bigger_than_two被触发
end
always @(bigger_than_two) //当bigger_than_two被触发，执行下面的过程
begin
  //过程的代码
end
一种经典的用法结构如下，可以理解为“在整个仿真过程中，一旦某变量发生变化，就执行某操作”：
always @(a)
begin
  x = x+1;
end
另一种用法称为OR事件时序控制，其代码结构为@(a or b)或@(a, b)，即当a或b其中任意一个变量发生变化时，代码或代码块才被触发执行。监视的变量如果有3个，则其代码结构变为@(a or b or c)或@(a, b, c)，以此类推。如果需要监视的变量很多，则可以使用@*或@(*)，它表示对之后代码块中的所有输入变量敏感。此外，敏感列表中除了变量，还可以是前面所提到过的常规事件、命名事件。
寄存器传输级描述 > 时序控制 > 电平敏感时序控制

Verilog中还有一种电平敏感时序控制方式，即使用wait(a)，当变量a为真，则执行后面的代码块。
寄存器传输级描述 > 顺序代码块与并行代码块

begin、end组合代表了这个代码块的各行代码是顺序执行的，这种代码块称为顺序代码块；后面的fork、join代表了这个代码块的各行代码是并发执行的，这种代码块称为并行代码块。与模块、过程不同，两种代码块是可以嵌套，即顺序代码块中可以包含并行代码块。下面的例子展示了这两种代码块嵌套使用的效果：
initial
fork
  x = 1; 
  y = 2; 
  begin
    z = 3;
    w = 4;
  end
join
由于这个initial过程使用了关键字fork、join，其中x、y、z的赋值同时于系统零时刻发生，而z和w由于位于一个顺序代码块中，因此w的赋值在z的赋值后才进行。
在使用并行代码块的时候，有可能引起代码的竞争，例如两个语句对一个变量同时进行赋值。虽然理论上两个语句同时执行，但是具体的情况是必然有一句先执行，但这与顺序语句块的“先后”有本质区别。实际的先后顺序取决于所用的仿真系统。这并不是Verilog硬件描述语言本身的缺陷，并行语句块是一种人为设定的功能，这可以让设计人员更容易地描述某些过程，当然他们必须认真考虑竞争带来的潜在问题。
寄存器传输级描述 > 任务和函数

如果某部分代码需要在不同地方多次使用，可以在模块中定义任务或函数。
任务通过关键字task来声明。任务可以有零个或者多个输入变量，但是没有输出返回值。调用任务时，将按照任务内指定的方式处理这些变量。由于它相当于一个子过程，因此任务中赋值的变量只能是寄存器类型的，而且只能使用过程赋值语句。任务可以具有时序结构，例如延迟、非阻塞赋值等。任务中可以调用任务和函数。与模块的声明不同，任务的声明没有类似模块端口列表的输入变量列表。尽管如此，调用任务的时候，还是需要在括号里按照任务声明时的顺序罗列输入变量。在某种程度上，任务和C语言中没有返回值的函数有些类似。
函数通过关键字function来声明。函数不仅有输入变量，还有一个返回值作为输出变量，这个返回值的名称与函数的名称相同。函数与任务不同，它是一个只有逻辑功能的部分，不能包含时序结构。函数中只能调用函数。Verilog中的函数与C语言中有返回值的函数有些类似。通常将函数放在赋值运算符的右边，它的返回值被赋值给左边的变量。
如果任务或函数同时在多个地方被调用，则需要使用automatic关键字声明，这样系统可以为不同地方的调用分配独立的内存空间。
逻辑门级描述

逻辑门级描述的抽象级别较低，仅次于晶体管级。实际的硬件电路往往都是以逻辑门级网表作为基础构建的，而设计人员常常会在进行更高抽象级别的设计。尽管如此，逻辑门级的设计还是更接近真实电路形式。Verilog提供了一系列逻辑门原语（Primitive）供用户使用。例如，非（not）、与门（and）、或门（or）、与非门（nand）、或非（nor）、异或（xor）、同或（xnor）。逻辑门原语和模块类似，可以通过实例引用的方式使用。
晶体管级描述

Verilog能够在低抽象级别对电路进行描述，是它的一个重要特点。Verilog中提供了多种晶体管级（也称开关级）元件类型，包括N型金属氧化物半导体场效应管（关键字为nmos）、P型金属氧化物半导体场效应管（关键字为pmos）、互補式金屬氧化物半導體（关键字为cmos）、带阻抗的互補式金屬氧化物半導體（关键字为rcmos）、电源单元（关键字为supply1）、接地单元（关键字为supply0）等。所有的晶体管都可以设置延迟属性。设计人员可以利用这些低抽象级元件构建所需要的逻辑门或直接构成其他高级组件。
延迟 > 逻辑门和晶体管的延迟

真实的硬件电路不可避免地都存在延迟现象。在Verilog中，可以对逻辑门、晶体管这些元件的延迟信息进行描述。可以为元件的延迟指定一个时间，则上升、下降、关断的延迟都使用这个时间；也可以按照先后顺序分别指定上升延迟、下降延迟，而关断延迟取二者较小值；当然也可以为上升、下降、关断各指定一个时间。例如，下面的代码为与门实例添加了三个延迟时间，分别对应上升、下降、关断：
and #(1, 2, 3) my_and (out, in1, in2);
逻辑门和晶体管的延迟属于“惯性延迟”。它的意思是，逻辑门和晶体管获得外部输入之后，延迟指定的时间后，才会将结果呈现在输出端上。在延迟期间，如果输入改变，但是这个信号的持续时间小于指定延迟的时间，则不会影响逻辑门和晶体管的输出；如果这个信号的持续时间大于指定延迟的时间，则之前的结果将不会呈现在输出端，改变输入信号后的结果将经过延迟后将呈现在输出端
Verilog还允许设计人员为每个延迟时间设置最大值、典型值、最小值，在编译阶段可以通过编译代码选择其中一个。
延迟 > 线网延迟

在声明线网或对线网进行连续赋值的时候，可以为线网添加延迟信息。这样，所有连续赋值给线网的表达式都会立即计算出结果，但是这个结果在延迟时间后才会赋值给线网。如果在这段延迟时间内，右侧表达式的结果发生变化，则用于赋值的表达式结果取变化后的。另外，如果如果输入变量变化的脉冲宽度小于延迟的时间，其变化不会对输出造成影响。这种延迟被称为“惯性延迟”，逻辑门和晶体管的延迟也是这种情况。
延迟 > 过程延迟

过程延迟在前面的延迟时序控制一部分讲述过。过程赋值语句中的延迟主要分为常规延迟（又称为外部延迟）和内嵌延迟（又称为内部延迟）两种，其中前者先延迟，再计算表达式、赋值给左边的变量；而后者先立即计算表达式，经过延迟后再将结果赋值给左边的变量。
延迟 > 路径延迟

设计人员可以在模块中关键字specify、endspecify之间对路径延迟进行描述。与元件的延迟不同，路径延迟是指信号在某两个寄存器类型或线网类型变量之间传递所需的延迟时间。在specify代码块中可以使用条件结构来根据情况选择所需的延迟时间值。与元件延迟相同的是，延迟的时间值可以指定上升、下降、关断的情况，同时也可以包含最大值、典型值、最小值。
逻辑综合

条目：逻辑合成
逻辑综合 > 概念简介

设计人员编写的Verilog代码通常是在较高抽象级别的，例如暫存器传输级。这一抽象级别包含了对电路信号在寄存器之间传输情况的描述。但是逻辑门级的网表，即逻辑门的相互连接形式，才最接近真实的硬件电路。这一形式与暫存器传输级的描述，在功能上是等效的。为了给后续硬件制造人员提供这种低抽象级别的描述，需要将高抽象级别的Verilog代码转换为低抽象级别的逻辑门级网表。这一过程称为逻辑合成（Logic Synthesis）。
在自动化逻辑合成工具出现之前，尽管人们可以用硬件描述语言进行设计，但是还是需要人工进行逻辑合成。例如，如果电路模块只有少数几个输入端，我们可以使用类似卡诺图的方法来对逻辑函数进行化简。随着电路规模不断增加，人工逻辑合成的容易出错、耗费大量时间的缺点逐渐凸显。同时，在某种特殊器件製程下最优化的综合结果不一定在另一种製程下还合适，如果需要采用另外的製程，设计人员需要花费很长时间重新进行逻辑合成。随着自动化逻辑合成工具的出现，硬件描述语言、所需器件製程信息（製程库）可以直接被逻辑合成工具读取，通过其内部的自动合成演算法，输出符合设计约束（通常包括时序、功耗、面积的约束）的逻辑门级网表。借助自动合成工具，设计人员可以将更多的精力放在高抽象级别的硬件描述语言设计。
逻辑综合 > 可合成代码

逻辑合成工具不能接受所有的Verilog代码。设计人员需要确保硬件描述语言代码是周期到周期的暫存器传输级描述。诸如while的循环结构必须通过信号边缘的形式（如@(posedge clock)）提供终止条件；initial结构可能也不能被转换。如果不指明数字的位宽，那么系统可能默认它为一个较大的值（如32位），这就可能产生规模非常庞大的逻辑门级网表，其中一部分是不必要的，这将造成资源的浪费。与未知逻辑x、高阻态z有关的运算符不能被转换，例如===、!==。此外，条件结构如果只有if而没有对else的情况进行设计，或者选择结构缺少默认情况default，很可能产生预期之外的锁存器。由于需要使用与製程相关的逻辑门，因此用户自定义的原语很可能不能被转换。设计人员需要采取良好的代码风格，以获得更优化的逻辑合成结果。为了适应符合可重用设计思想的系统芯片、IP核设计，设计人员还应该遵循更严格的编码规范。
| 结构类型 | 注 |
| --- | --- |
initial: 只用于仿真测试文件（test bench）
events: Events对于同步测试文件的各个组件比较有意义
real: Real数据类型不可合成
time: Time数据类型不可合成
force和release: Force和release不可合成
assign和deassign: reg类型的assign和deassign操作不可合成，但是wire类型的assign操作可以合成
fork join: 使用非阻塞赋值可以获得同样效果
primitive: 只有门级的原语（primitives）可合成
table: 用户自定义原语（UDP）及table不可合成
#1: 延迟只用于仿真，综合器一般直接忽略延迟
高级功能 > 用户自定义原语

除了系统提供的26种逻辑门、晶体管原语，Verilog也提供用户自定义原语（User Defined Primitive, UDP）。原语与模块的层次结构类似，但是原语的输入输出关系是完全通过查表实现的。组合逻辑的用户自定义原语的核心是真值表，时序逻辑的用户自定义原语的核心是激励表。设计人员需要在状态表中罗列可能出现的输入和输出情况。如果在实际使用过程中，遇到状态表中没有定义的情况，则输出不确定值x。使用自定义原语很直观，但是如果输入变量较多，状态表就会变得很复杂。在很多情况中，用户自定义原语并不能被逻辑综合工具转换。
高级功能 > 编程语言接口

编程语言接口（Program Language Interface, PLI）提供了通过C语言函数对Verilog数据结构进行存储、读取操作的途径。
Verilog编程语言接口的发展先后经过了三代，其中第一代为任务或函数子程序，它可以在C程序和Verilog设计之间传递数据；第二代为存取子程序，它可以在用户自定义C程序和Verilog的内部数据表示的接口上被使用；第三代为Verilog过程接口，它进一步扩展了前两代编程语言接口的功能。
通过使用编程语言接口，设计人员可以自定义接口的功能，然后通过类似调用系统任务的方式调用这些自定义功能。这样，设计人员可以很大程度地扩展他们能使用的功能，例如监视、激励、调试功能，或者用它来提取设计信息、显示输出等。
相关电子设计自动化工具

参见：电子设计自动化
Verilog作为业界使用最广泛的硬件描述语言之一，有大量的电子设计自动化工具对它予以支持。通过使用集成开发环境，设计人员可以在常见的Windows或其他图形化系统中进行设计、仿真、验证，例如Cadence和Synopsys等公司提供的集成电路计算机辅助设计系统。
与VHDL的比较

参见：VHDL
Verilog硬件描述语言（Verilog Hardware Description Language）的英语缩写Verilog HDL和另一种类似的硬件描述语言VHDL在名称上容易混淆，实际上二者是两种不同的硬件描述语言。一些高级的电子设计自动化工具支持用户在项目内同时使用Verilog和VHDL来进行硬件设计。
VHDL是由美国国防部主持研发的硬件描述语言，成为了第一个成为电气电子工程师学会标准的硬件描述语言，美国政府相关的项目都是基于VHDL；而Verilog由民间商业公司的私有产品发展为IEEE标准的，因此在商用领域的市场占有量更大，设计人员和支持资源比VHDL更广。在美国大约有10万设计人员、200所大学教授采用Verilog硬件描述语言。
Verilog和VHDL作为业界广泛认可、同为电气电子工程师学会标准的硬件描述语言，有着各自的特点。VHDL的设计之初就更加针对标准化进行设计，Verilog则具有简明、高效的代码风格。两种语言都能够在多个抽象层次对数字电路建模，并且可以与验证、仿真、综合工具协同工作。其中，Verilog的逻辑门级、晶体管级级电路描述能力更强，VHDL不具备这样低级的描述能力，但是另一方面，VHDL的系统级抽象描述能力则比Verilog强。另外，由于Verilog与C语言在语法上有相似之处，因此具有C语言基础的设计人员更容易掌握它，而VHDL设计人员需要具有Ada语言编程基础，并且学习周期比Verilog更长。相关学术文献显示，在美国的高级数字系统设计领域，Verilog和VHDL的使用比率大约分别为80%和20%，这项比率在日本和台湾和美国相似。随着Verilog-A被合并到Verilog标准之中，而该部分后来成为了Verilog-AMS的一部分，该语言增加了对模拟电子系统的描述能力，因此它在混合信号集成电路中有着更广泛的应用。
迪索托 (密蘇里州)

| 迪索托 De Soto |
| --- | --- |
城市

 迪索托在傑佛遜縣及密蘇里州的位置（以紅色標示）
迪索托迪索托在密蘇里州的位置
坐标： 38°08′28″N 90°33′39″W﻿ / ﻿38.14111°N 90.56083°W﻿ / 38.14111; -90.56083
國家: 美国
州份: 密蘇里州
縣: 傑佛遜縣
面积
 • 总计: 11.35 平方公里（4.38 平方英里）
 • 陸地: 11.35 平方公里（4.38 平方英里）
 • 水域: 0.00 平方公里（0.00 平方英里）
海拔: 166 公尺（545 英尺）
人口（2020）
 • 總計: 6,449人
 • 密度: 568人/平方公里（1,472人/平方英里）
时区: CST（UTC-6）
 • 夏时制: CDT（UTC-5）
郵區編號: 63020
電話區號: 636（英语：）
GNIS ID: 2394475
迪索托（英語：）是位於美國密蘇里州傑佛遜縣的城市。
人口

根據2020年美國人口普查的數據，迪索托的面積為11.35平方千米，皆為陸地。當地共有人口6449人，而人口密度為每平方千米568人。
參考文獻

1 2  . United States Census Bureau.   [2022-05-21]. （原始内容存档于2022-05-28）.
↑  . . United States Geological Survey.
|  论 编傑佛遜縣行政區劃 |
| --- | --- | --- |
：希爾斯伯勒
| 城市 |  阿諾德  伯恩斯米爾  克里斯特爾城  迪索托  費斯特斯  赫庫蘭尼姆  希爾斯伯勒  基姆斯威克  奧林皮安村  佩夫利  | 傑佛遜縣在密蘇里州的位置 |
| 村 |  錫達希爾萊克斯  萊克特卡奎莎  帕克代爾  皮斯富爾村  斯科茨代爾  | 傑佛遜縣在密蘇里州的位置 |
| 行政鎮區 |  阿諾德鎮區  比格里弗鎮區  森特勒爾鎮區  海里奇鎮區  因皮里爾鎮區  喬基姆鎮區  梅勒梅克鎮區  普拉廷鎮區  里弗維尤鎮區  羅克鎮區  瓦爾鎮區  溫莎鎮區  | 傑佛遜縣在密蘇里州的位置 |
| 普查規定居民點 |  巴恩哈特  布賴爾伍德埃斯泰茨  錫達希爾  海里奇  霍林  因皮里爾  拉巴克克里克  墨菲  雷恩特里普蘭泰申  薩默塞特  | 傑佛遜縣在密蘇里州的位置 |
| 非建制地區 |  安東尼亞  貝利  貝盧斯克里克  布什堡  丹比  迪特默  唐奈  弗萊徹  弗魯科姆  弗魯梅特  戈德曼  格魯布維爾  希馬蒂特  豪斯斯普林斯  賈維斯  諾爾普  洛科爾  路德維格  馬帕維爾  梅爾佐  莫斯米爾  曼森斯  厄爾曼  奧爾德邁恩斯‡  帕平  普拉廷  里賈納  里弗賽德  拉什陶爾  塞克曼  塞爾馬  薩爾弗斯普林斯  瓦爾斯邁恩斯  維多利亞  瓦恩蘭  韋爾  | 傑佛遜縣在密蘇里州的位置 |
| 備註 |  ‡跨縣聚居地  | 傑佛遜縣在密蘇里州的位置 |
新幹線E8系電力動車組

| 新幹線E8系電動列車 |
| --- | --- |
新幹線E8系列車
概覽
製造: 日立製作所 川崎重工業
車輛總數: 105（15列）
製造年份: 2023年～
: 2024年3月16日
技術數據
列車編組: 7節 (5M2T)
轨距: 1,435mm
編組: 355人（其中綠色車廂26席）
營運速度: 新幹線段：300km/h 在來線段：130km/h
供電制式: 新幹線段：25,000V交流電（50Hz） 在來線段：20,000V交流電（50Hz）
安全防護系統: DS-ATC、ATS-P
| 日語寫法 |
| --- | --- |
日語原文: 
假名: 
平文式罗马字: 
新幹線E8系電動列車是東日本旅客鐵道（JR東日本）於2024年3月16日投入營業的新干线直行特急（迷你新干线）用列車，將主要行駛山形新幹線。
概要

E8系在2020年3月3日由JR東日本發佈，將行駛山形新幹線直通東北新幹線的直通特急列車，替代現行的E3系。届時山形新幹線列車的最高營運速度將由E3系的每小時275公里提升到E8系的300公里，並在東北新幹線路段改爲與時速較高的E5系併結行駛，縮短來往東京及山形的所需時間。首列車已在2023年1月26日出廠，於2月24日首度公開內裝及外觀，并在2024年春季投入服務。
构造 > 设计概念

列車內外均由工業設計師奥山清行、川崎重工業合作设计。列車以「編織豐饒的風土及心意」爲設計概念。根據JR東日本的描述，E8系的設計繼承上一代車輛植根山形地區的形象，把山形美麗的風土和處於遠方人們之心靈連繫起來。
构造 > 外观

車頭鼻形採用跟E6系類似的「箭線型」設計，車頭長9米，較E3系長了3米，但比E6系的13米爲短，以在提速及載客量之間取得平衡。
E8系的車輛塗裝設計跟E3系2014年版塗裝一樣，由白、紫、紅三色構成，車體主色爲「藏王白」；車頭及車頂漆上「鴛鴦紫」；側面貫穿列車的色帶配以「紅花黃」色。
构造 > 转向架

全車採用能夠抑制振動的電氣式主動懸掛系統，以改善乘車的舒適度。
构造 > 车內设备

每列7輛編組之列車設置包括綠色車廂及普通車廂2種等級之車廂，載客量爲355人，較上一代的E3系稍微減少39座。
包括普通车厢在内，全列車每個座位均設置交流電插座，並提供車内免費Wi-Fi服務。車廂内及車廂間走廊都設有監控閉路電視。
考虑到冬季时会有许多日本国外游客以及滑雪爱好者携带大件行李及滑雪板乘车，因此在每節車廂均设置了大件行李摆放区。全車共設有3個輪椅停放空間，其中普通等車廂設有2個，較以往車型增加1個。
參考資料

1 2 3 4 5 6 7   (PDF). 東日本旅客鐵道.   [2020-03-03]. （原始内容存档 (PDF)于2020-05-21） （日语）.
1 2 3  . 朝日新聞.   [2020-03-04]. （原始内容存档于2020-11-26） （日语）.
↑  . NHK.   [2020-03-04]. （原始内容存档于2020-03-03） （日语）.
↑  . Mynavi News.   [2020-03-04]. （原始内容存档于2020-08-09） （日语）.
1 2  . Response.jp.   [2020-03-04]. （原始内容存档于2020-03-27） （日语）.
1 2  . 東洋經濟Online.   [2020-03-04]. （原始内容存档于2021-10-10） （日语）.
↑  . Japan Railfan Magazine Online. Japan: Koyusha Co., Ltd. 04-03-2014  [4 March 2014]. （原始内容存档于2020-08-03） （日语）.  请检查|date=中的日期值 (帮助)
1 2 3 4  . Mynavi News.   [2020-03-04]. （原始内容存档于2021-02-24） （日语）.
1 2  . Travel Watch.   [2020-03-04]. （原始内容存档于2020-03-04） （日语）.
↑  . raillab.jp.   [2020-03-04]. （原始内容存档于2021-03-19） （日语）.
↑  . Japan Railfan Magazine Online. Japan: Koyusha Co., Ltd.   [2020-03-03]. （原始内容存档于2020-03-03） （日语）.
↑  高橋昌宏. . 朝日新聞デジタル. 2023-02-25  [2023-03-05]. （原始内容存档于2023-04-27）.
相關條目

新幹線E3系電力動車組
新幹線E6系電力動車組
查巴·梅積利

| 個人 |
| --- | --- | --- | --- |
全名:  Jaba Mujiri
出生日期:   (1980-06-07) 1980年6月7日（44歲）
出生地點:  格魯吉亞第比利斯
身高:  
位置:  後衛

現在所屬:  科拉特
球衣號碼:  14
青年隊
1998-00:  第比利斯國立大學
職業*
| 年份 |  球隊 |  （） |   |
| 2000-05 2005-08 2008 2009- |  WIT格魯吉亞 沙巴罕 施安尼 弗蘭德 |   148 (8) 0550 (1)  030 (1)  |   |

|  |  格魯吉亞U-21 |  6 (0)    |   |
 * 職業次數與數僅計算國內聯賽部份 最後更新於：15 September 2008 
查巴·梅積利（，1980年6月7日—），是格魯吉亞的足球運動員，司職後衛。
榮譽

格魯吉亞聯賽: 1
2003/04
伊朗盃: 2
2005/06
2006/07
黎成恩

| 黎成恩 |
| --- | --- |
黎成恩官方肖像

 美国驻胡志明市总领事
任期 2010年8月6日—2013年7月
前任: 肯尼斯·费尔法克斯
继任: 蕾娜·比特尔（英语：）
 
个人资料
出生: 1954年  越南国前江省鹅贡市社（今 越南前江省鹅贡市）
配偶: Tam Le
母校: 乔治·华盛顿大学
黎成恩（越南語：，1954年—）是一位越南裔美国政治人物、美国高级外交官，毕业于乔治·华盛顿大学，曾在亚洲多国的美国使馆工作，2010年成为首任越南裔的美国驻胡志明市总领事。
生平

1954年，黎成恩出生在南越，后移居法国，在那里被一位美国外交官收养，赴美定居弗吉尼亚州。1976年，他在乔治·华盛顿大学获得了电气技术专业的理学学士学位，1978年又取得了技术管理专业的理学硕士学位。
毕业后，黎成恩在美国海军部工作了15年，直到1991年加入美国国务院，开始了他的外交生涯，赴美国驻华大使馆工作。1994年，他被调至美国驻日本大使馆，1997年转到美国驻马来西亚大使馆任职，2001年转至美国驻新加坡大使馆，2004年，黎成恩在美国驻韩国大使馆工作，2006年获得卢瑟·雷普洛格尔（英语：）管理进步奖（）。在2007年至2010年间，他在法国巴黎的驻法大使馆任公使衔参赞。2010年8月6日，黎成恩回到了他的出生地越南，担任美国驻胡志明市总领事，2013年7月卸任。
史達林·馬提

史達林·哈維爾·馬提（英語：，1988年10月9日—），為美國職棒大聯盟的外野手，目前效力於紐約大都會。他於2012年在海盜隊登上大聯盟，生涯入選過一次明星賽及拿下2次金手套獎。2020年被交易至響尾蛇，季中再被交易到馬林魚。
早年

馬提在聖多明哥長大，他在9歲時母親去世，並由奶奶一手帶大。
職業生涯 > 匹茲堡海盜

2012年7月12日，馬提登上大聯盟。他成為隊史第一位登上大聯盟的拉丁裔多明尼加籍球員。他在生涯首打席面對太空人投手達拉斯·凱戈，第一球就擊出全壘打。而他也因此成為隊史繼1922年後來第一位在生涯首球首打席就擊出全壘打的球員。
2014年3月28日，他與海盜隊簽下6年310萬美元的合約。2015年，他拿下個人生涯首座金手套獎。
2017年4月18日，馬提因為藥檢被檢測出體內含有19-去甲睾酮(俗稱諾龍)的興奮劑，因此遭到聯盟懲處80場禁賽。他在7月18日回歸球場。該年他打擊率為2成75，另有21次盜壘成功。2018年球季，他的打擊率為2成77，另有33次盜壘成功。他和Jean Segura也成為大聯盟繼2013年來唯二每年達成至少單季20盜的球員。2019年球季，他的打擊率為2成95，23轟82分打點。防守方面，他的DRS為-11，是大聯盟中外野手最低的數據記錄。
職業生涯 > 亞利桑那響尾蛇

2020年1月27日，海盜隊用馬提向響尾蛇交易Liover Peguero、Brennan Malone兩名小聯盟球員，以及一份國際額外簽約金。
職業生涯 > 邁阿密馬林魚

2020年8月31日，馬林魚用Caleb Smith、Humberto Mejía和一名日後指定球員向響尾蛇交易馬提。該年他的打擊率為2成81，並敲出6轟與27分打點。
2021年4月，馬提因為受傷而在3A進行復健賽。他在6月中成為馬林魚隊史自2017年後首位拿下單週最佳球員的選手。7月18日，他拒絕了馬林魚開出3000萬美元的延長合約報價。
職業生涯 > 奧克蘭運動家

2021年7月28日，馬林魚將馬提交易到運動家，換來Jesús Luzardo。
職業生涯 > 紐約大都會

2021年11月26日，馬提和大都會簽下4年7800萬美元的合約。
個人生活

馬提目前育有2子1女，而他的妻子Noelia在2020年5月因為心臟病不幸去世。
參考資料

↑  Biertempfel, Rob. . Pittsburgh Tribune-Review. July 27, 2012  [2019-11-21]. （原始内容存档于2018-04-01）.
↑  Biertempfel, Rob. . Pittsburgh Tribune-Review. July 26, 2012  [2019-11-21]. （原始内容存档于2018-03-31）.
↑  Singer, Tom. . Pittsburgh Pirates. July 25, 2012  [2019-11-21]. （原始内容存档于2013-12-13）.
↑  Singer, Tom. . Pittsburgh Pirates. July 26, 2012  [2019-11-21]. （原始内容存档于2012-07-30）.
↑  . ESPN. July 26, 2012  [2019-11-21]. （原始内容存档于2016-03-04）.
↑  Singer, Tom. . MLB.com. March 27, 2014  [March 28, 2014]. （原始内容存档于2014-03-28）.
↑  . ESPN.com. Associated Press. March 28, 2014  [March 28, 2014]. （原始内容存档于2014-03-28）.
↑  Miller, Doug. . MLB.com. November 10, 2015  [November 10, 2015]. （原始内容存档于2015-11-12）.
↑  Berry, Adam. . MLB.com.   [April 18, 2017]. （原始内容存档于2017-07-03）.
↑  Calcaterra, Craig. . HardballTalk. 2017-07-18  [2017-07-19]. （原始内容存档于2017-07-20）.
1 2  . Baseball-Reference.com.   [2019-11-21]. （原始内容存档于2019-11-19）.
↑  . MLB.com.   [2019-11-21]. （原始内容存档于2019-12-24）.
↑  . Fangraphs.com. 2019-01-01  [2019-10-07]. （原始内容存档于2020-02-11）.
↑  .   [2020-05-19]. （原始内容存档于2020-01-29）.
↑  . Marlins Press Releases. August 31, 2020  [August 31, 2020].
↑  . Baseball-Reference.com.   [2019-11-21]. （原始内容存档于2019-11-19）.
↑  . MLB.com.   [2021-07-29]. （原始内容存档于2021-06-15）.
↑  . MLB Trade Rumors.   [2021-07-29]. （原始内容存档于2021-07-29）.
↑  Kelly, Matt. . mlb.com. July 28, 2021  [July 28, 2021]. （原始内容存档于2021-08-06）.
↑  Chung, Gabrielle. . 人物. May 18, 2020  [19 May 2020]. （原始内容存档于2020-05-19） （英语）.