目录
Verilog是一种硬件描述语言,用于描述数字电路的行为和结构。它是一种结构化的语言,可以用于描述数字电路的时序和组合逻辑。
Verilog和C/C++语言类似,关键字(或关键词)也叫保留字,Verilog中有许多关键字,其中always、and、assign、begin、buf、bufif0和bufif1是常用的关键字。在Verilog HDL中,所有的关键字是事先定义好的确认符,用来组织语言结构。关键字是用小写字母定义的,因此在编写原程序时要注意关键字的书写,以避免出错。下面是Verilog HDL中使用的关键词,这些保留字是识别语法的关键,Verilog一共103个关键字,按照字母顺序排列依次如下:
always, and, assign, begin, buf, bufif0, bufif1, case, casex, casez, cmos, deassign, default, defparam, disable, edge, else, end, endcase, endfunction, endmodule, endprimitive, endspecify, endtable, endtask, event, for, force, forever, fork, function, highz0, highz1, if, ifnone, initial, inout, input, integer, join, large, macromodule, medium, module, nand, negedge, nmos, nor, not, notif0, notif1, or, output, parameter, pmos, posedge, primitive, pull0, pull1, pulldown, pullup, rcmos, real, realtime, reg, release, repeat, rnmos, rpmos, rtran, rtranif0, rtranif1, scalared, small, specify, specparam, strength, strong0, strong1, supply0, supply1, table, task, time, tran, tranif0, tranif1, tri, tri0, tri1, triand, trior, trireg, vectored, wait, wand, weak0, weak1, while, wire, wor, xnor, xor
本篇将介绍下什么是Verilog的关键字,以及关键字的作用,然后再逐一总结下103个Verilog的所有关键字的作用和用法,以及再顺带介绍了下可综合和不可综合的关键字。由于篇幅比较长,Verilog关键字的总结将分为上下两篇文章。
FPGA专栏:https://blog.csdn.net/zhouruifu2015/category_5690253
Verilog关键字介绍完后,下一篇将详细介绍下关于C/C++的所有关键字特性、作用和用法。
- Verilog关键字(上)总结
- Verilog关键字(下)总结
- C关键字总结
- C++关键字总结
- Python关键字总结
- Go关键字总结
- JavaScript关键字总结
其他语言关键字详情请关注公众号:【CTO Plus】获取更多学习资源。
Verilog关键字的作用
关键字(Keyword)是编程语言中具有特殊含义的保留字,不能用作变量名或函数名等标识符。编程语言使用关键字来表示特定的操作、语句、数据类型等,以便编译器或解释器识别并正确解析代码。
编程语言中使用关键字的主要目的是为了提高代码的可读性和可维护性。通过使用关键字,编程人员可以更加清晰地表达代码的意图,减少代码的歧义,避免出现错误。
关键字可以用于描述数字电路的行为和结构,可以用于定义模块的输入和输出端口,以及定义信号的类型。在实际编写数字电路时,我们应该根据具体需求选择合适的关键字,编写高效、简洁、可读性好的Verilog代码。
Verilog常用的一些关键字
Verilog中的关键字是一些具有特定语义和用法的单词。以下是一些常用的Verilog关键字:
1. always:用于创建一个时序块,其中的代码会按照时序规则执行,产生reg信号语句的关键字。
always是Verilog中的一个关键字,用于创建一个时序块。在Verilog中,时序块是一种用于描述数字电路中的时序逻辑的结构,always关键字可以用于创建一个时序块,其中的代码会按照一定的时序规则执行。
示例代码:
always @(posedge clk) begin
if (reset) begin
counter <= 0;
end else begin
counter <= counter + 1;
end
end
2. assign:用于创建一个组合块,其中的代码会按照组合逻辑规则执行,产生wire信号语句的关键字。
assign是Verilog中的一个关键字,用于创建一个组合块。在Verilog中,组合块是一种用于描述数字电路中的组合逻辑的结构,assign关键字可以用于创建一个组合块,其中的代码会按照组合逻辑规则执行。
示例代码:
assign out = (a & b) | (c & d);
3. begin/end:用于创建一个代码块,其中的代码会按照顺序执行,语句的起始和结束标志。
4. module:模块开始的定义,用于创建一个模块,其中包含了数字电路的结构和行为。
module是Verilog中的一个关键字,用于创建一个模块。在Verilog中,模块是一种用于描述数字电路中的子电路的结构,module关键字可以用于创建一个模块,其中可以包含输入输出端口、内部信号和子模块等。
示例代码:
module adder(input [7:0] a, input [7:0] b, output [8:0] sum);
assign sum = a + b;
endmodule
5. input/output:用于定义模块的输入和输出端口定义。
6. wire/reg:用于定义信号的类型(wire信号定义和reg信号定义),wire表示连续信号,reg表示时序信号。
wire是Verilog中的一个关键字,用于声明一个信号。在Verilog中,信号是一种用于在数字电路中传递信息的结构,wire关键字可以用于声明一个信号,其中的值可以被多个模块共享。
示例代码:
wire [7:0] a, b;
reg是Verilog中的一个关键字,用于声明一个寄存器。在Verilog中,寄存器是一种用于在数字电路中存储信息的结构,reg关键字可以用于声明一个寄存器,其中的值只能被当前模块使用。
示例代码:
reg [7:0] counter;
7. always_comb/always_ff:用于创建一个组合逻辑块或时序逻辑块。
8. inout 双向端口定义。
9. parameter 信号的参数定义。
10. posedge/negedge 时序电路的标志。
11. case:case语句起始标记。
case是Verilog中的一个关键字,用于创建一个多路选择语句。在Verilog中,多路选择语句是一种用于根据多个条件执行不同的代码块的结构,case关键字可以用于创建一个多路选择语句,其中的代码块会根据条件进行选择性执行。
示例代码:
case (opcode)
3'b000: begin
// code for opcode 000
end
3'b001: begin
// code for opcode 001
end
// more cases
endcase
12. default:ase语句的默认分支标志。
13. endcase:case语句结束标记。
14. if:if/else语句标记。
if是Verilog中的一个关键字,用于创建一个条件语句。在Verilog中,条件语句是一种用于根据条件执行不同的代码块的结构,if关键字可以用于创建一个条件语句,其中的代码块会根据条件进行选择性执行。
示例代码:
if (reset) begin
counter <= 0;
end else begin
counter <= counter + 1;
end
15. else:if/else语句标记。
16. for:for语句标记。
for是Verilog中的一个关键字,用于创建一个循环语句。在Verilog中,循环语句是一种用于重复执行一段代码的结构,for关键字可以用于创建一个循环语句,其中的代码块会按照循环规则重复执行。
示例代码:
for (i = 0; i < 8; i = i + 1) begin
// code to be repeated
end
17. endmodule:模块结束定义。
可综合和不可综合的关键字
可综合(Synthesizable)是指可以被综合器(Synthesizer)转换为硬件电路的代码。在FPGA设计中,可综合的代码可以被综合器转换为硬件电路,从而实现所需的功能。可综合代码应该具有以下特点:
1. 代码应该是结构化的,不能使用goto语句或其他不可综合的语言结构。
2. 代码应该是可重用的,可以在不同的设计中使用。
3. 代码应该是可读的,易于维护和修改。
可综合关键字是指在FPGA设计中可以被综合器识别和转换为硬件电路的关键字。常见的可综合关键字包括:
1. always:用于定义时序逻辑的关键字。
2. case:用于实现多路选择器的关键字。
3. assign:用于赋值操作的关键字。
4. wire:用于定义信号的关键字。
不可综合关键字是指在FPGA设计中不能被综合器识别和转换为硬件电路的关键字。常见的不可综合关键字包括:
1. $display:用于调试输出的关键字。
2. $monitor:用于监视信号的关键字。
3. $finish:用于结束仿真的关键字。
在FPGA设计中,应该尽量避免使用不可综合关键字,以免影响设计的可综合性和性能。
Verilog所有关键字的作用和用法
下面将对Verilog的所有关键字的作用和用法进行详细的一一介绍。限于偏于本篇将介绍前40个关键字,后63个将在下一篇做介绍。
- always
always是Verilog中的一个关键字,用于创建一个时序块。在Verilog中,时序块是一种用于描述数字电路中的时序逻辑的结构,always关键字可以用于创建一个时序块,其中的代码会按照时序逻辑规则执行。always块可以根据时钟触发或者条件触发进行执行。
示例代码:
always @(posedge clk) begin
// code to be executed on rising edge of clock
end
- and
and是Verilog中的一个关键字,用于创建一个与门。在Verilog中,与门是一种用于实现布尔逻辑的结构,and关键字可以用于创建一个与门,其中的输入信号经过与运算后,输出信号为1或0。
示例代码:
wire a, b, c;
and gate (c, a, b);
- assign
assign是Verilog中的一个关键字,用于创建一个组合块。在Verilog中,组合块是一种用于描述数字电路中的组合逻辑的结构,assign关键字可以用于创建一个组合块,其中的代码会按照组合逻辑规则执行。
示例代码:
assign out = (a & b) | (c & d);
本篇原文:https://blog.csdn.net/zhouruifu2015/article/details/130905198
- begin
begin是Verilog中的一个关键字,用于创建一个代码块。在Verilog中,代码块是一种用于组织代码的结构,begin关键字可以用于创建一个代码块,其中的代码会按照顺序执行。
示例代码:
always @(posedge clk) begin
// code to be executed on rising edge of clock
end
- buf
buf是Verilog中的一个关键字,用于创建一个缓冲器。在Verilog中,缓冲器是一种用于放大电路信号的结构,buf关键字可以用于创建一个缓冲器,其中的输入信号经过放大后,输出信号与输入信号相同。
示例代码:
wire a, b;
buf gate (b, a);
- bufif0
bufif0是Verilog中的一个关键字,用于创建一个带有使能信号的缓冲器。在Verilog中,带有使能信号的缓冲器是一种用于放大电路信号的结构,bufif0关键字可以用于创建一个带有使能信号的缓冲器,其中的输入信号经过放大后,输出信号与输入信号相同,当使能信号为0时,输出信号为高阻态。
示例代码:
wire a, b, enable;
bufif0 gate (b, a, enable);
- bufif1
bufif1是Verilog中的一个关键字,用于创建一个带有反向使能信号的缓冲器。在Verilog中,带有反向使能信号的缓冲器是一种用于放大电路信号的结构,bufif1关键字可以用于创建一个带有反向使能信号的缓冲器,其中的输入信号经过放大后,输出信号与输入信号相同,当使能信号为1时,输出信号为高阻态。
示例代码:
wire a, b, enable;
bufif1 gate (b, a, enable);
- case
case关键字用于描述多路选择器,它可以根据输入信号的值选择相应的输出信号。以下是一个简单的case语句示例:
case (sel)
2'b00: out = a;
2'b01: out = b;
2'b10: out = c;
2'b11: out = d;
endcase
在这个示例中,我们使用case语句根据sel的值选择相应的输出信号。当sel为2'b00时,out等于a;当sel为2'b01时,out等于b;以此类推。
- casex
casex关键字也用于描述多路选择器,但它可以处理不确定的输入信号值。以下是一个简单的casex语句示例:
casex (sel)
4'b00xx: out = a;
4'b01xx: out = b;
4'b10xx: out = c;
4'b11xx: out = d;
endcase
在这个示例中,我们使用casex语句根据sel的值选择相应的输出信号。当sel的最高位为0,次高位为0时,out等于a;当sel的最高位为0,次高位为1时,out等于b;以此类推。如果sel的后两位是不确定的,也可以使用xx表示。
- casez
casez关键字也用于描述多路选择器,但它可以处理不确定的输入信号值,并且可以将输入信号的未知值(Z)视为0。以下是一个简单的casez语句示例:
casez (sel)
4'b00zz: out = a;
4'b01zz: out = b;
4'b10zz: out = c;
4'b11zz: out = d;
endcase
在这个示例中,我们使用casez语句根据sel的值选择相应的输出信号。当sel的最高位为0,次高位为0时,out等于a;当sel的最高位为0,次高位为1时,out等于b;以此类推。如果sel的后两位是不确定的或者是Z,也可以使用zz表示。
- cmos
cmos关键字用于描述CMOS逻辑门,包括CMOS反相器、CMOS与门、CMOS或门等。以下是一个简单的CMOS逻辑门示例:
module cmos_inv(input a, output y);
cmos (y, a, a);
endmodule
在这个示例中,我们定义了一个CMOS反相器模块,它有一个输入端口a和一个输出端口y。在模块中,我们使用cmos语句描述了CMOS反相器的逻辑。
- deassign
deassign关键字用于取消信号的赋值。以下是一个简单的deassign语句示例:
deassign a;
在这个示例中,我们使用deassign语句取消了信号a的赋值。这意味着信号a现在没有值,可以重新赋值。
- default
default关键字用于描述case语句中的默认情况。当输入信号的值与case语句中的所有情况都不匹配时,将执行default语句。以下是一个简单的default语句示例:
case (sel)
2'b00: out = a;
2'b01: out = b;
2'b10: out = c;
default: out = d;
endcase
在这个示例中,我们使用default语句定义了输入信号sel的默认情况。当sel不是2'b00、2'b01或2'b10时,out等于d。
- defparam
defparam关键字用于为模块的参数赋值。以下是一个简单的defparam语句示例:
defparam adder.width = 8;
在这个示例中,我们使用defparam语句为模块adder的宽度参数赋值为8。这意味着adder将使用8位宽度进行运算。
- disable
disable关键字用于禁用任务或函数。在Verilog中,任务和函数是用来执行特定功能的代码块。如果需要在执行任务或函数的过程中停止它们的执行,就可以使用disable语句。以下是一个简单的disable语句示例:
task my_task;
// 任务代码块
endtask
initial begin
my_task; // 执行任务
disable my_task; // 停止任务执行
end
在这个示例中,我们定义了一个名为my_task的任务,并在initial块中执行它。然后,我们使用disable语句停止my_task的执行。
- edge
edge关键字用于描述时钟信号的边沿类型。在数字电路中,时钟信号通常用于同步电路中,用于控制电路的行为。时钟信号的边沿类型可以是上升沿、下降沿或两者都有。以下是一个简单的edge语句示例:
always @(posedge clk)
// 时钟上升沿触发的代码块
在这个示例中,我们使用edge关键字描述时钟信号的上升沿类型,并在always块中编写了时钟上升沿触发的代码块。
- else
else关键字用于描述if语句中的默认情况。当if语句中的条件不成立时,将执行else语句。以下是一个简单的else语句示例:
if (a == b)
// 条件成立的代码块
else
// 默认情况的代码块
在这个示例中,我们使用else语句定义了if语句中的默认情况。当a等于b时,将执行条件成立的代码块;否则,将执行默认情况的代码块。
- end
end关键字用于结束模块、任务或函数的定义。在Verilog中,每个模块、任务或函数都必须以end关键字结束。以下是一个简单的end语句示例:
module my_module(input a, output b);
// 模块代码块
endmodule
在这个示例中,我们使用endmodule语句结束了模块my_module的定义。
- endcase
endcase关键字用于结束case语句的定义。在Verilog中,case语句用于根据输入信号的值选择相应的输出信号。以下是一个简单的endcase语句示例:
case (sel)
2'b00: out = a;
2'b01: out = b;
2'b10: out = c;
default: out = d;
endcase
在这个示例中,我们使用endcase语句结束了case语句的定义。
- endfunction
endfunction关键字用于结束函数的定义。在Verilog中,函数是用来执行特定功能并返回结果的代码块。以下是一个简单的endfunction语句示例:
function [7:0] my_function;
// 函数代码块
endfunction
在这个示例中,我们使用endfunction语句结束了函数my_function的定义。
- endmodule
endmodule关键字用于结束模块的定义。在Verilog中,模块是用来描述数字电路的基本组件。以下是一个简单的endmodule语句示例:
module my_module(input a, output b);
// 模块代码块
endmodule
在这个示例中,我们使用endmodule语句结束了模块my_module的定义。
- endprimitive
endprimitive关键字用于结束primitive的定义。在Verilog中,primitive是一种基本的数字电路元素,用于描述数字电路的物理实现。以下是一个简单的endprimitive语句示例:
primitive and_gate (input a, input b, output c);
// primitive代码块
endprimitive
在这个示例中,我们使用endprimitive语句结束了primitive and_gate的定义。
- endspecify
endspecify关键字用于结束specify块的定义。在Verilog中,specify块用于描述数字电路的时序和延迟。以下是一个简单的endspecify语句示例:
specify
// specify代码块
endspecify
在这个示例中,我们使用endspecify语句结束了specify块的定义。
- endtable
endtable关键字用于结束table块的定义。在Verilog中,table块用于描述数字电路的真值表。以下是一个简单的endtable语句示例:
table my_table (input a, input b, output c);
// table代码块
endtable
在这个示例中,我们使用endtable语句结束了table my_table的定义。
- endtask
endtask关键字用于结束task的定义。在Verilog中,task是一种用于执行特定功能的代码块。以下是一个简单的endtask语句示例:
task my_task;
// 任务代码块
endtask
在这个示例中,我们使用endtask语句结束了task my_task的定义。
- event
event关键字用于描述事件,即数字电路中的信号变化。在Verilog中,event通常与wait语句一起使用,用于等待某个事件的发生。以下是一个简单的event语句示例:
always @(event clk)
// 事件触发的代码块
在这个示例中,我们使用event关键字描述了时钟信号的边沿类型,并在always块中编写了事件触发的代码块。
- for
for关键字用于描述循环语句。在Verilog中,for语句通常用于重复执行一段代码块。以下是一个简单的for语句示例:
for (i = 0; i < 10; i = i + 1)
// 循环执行的代码块
在这个示例中,我们使用for语句描述了一个循环,i从0开始,每次增加1,直到i小于10为止,重复执行循环执行的代码块。
- force
force关键字用于强制改变数字电路中的信号值。在Verilog中,force通常与initial语句一起使用,用于初始化数字电路的状态。以下是一个简单的force语句示例:
initial begin
force a = 1;
#10 release a;
end
在这个示例中,我们使用force语句将信号a的值强制设为1,然后使用release语句在10个时间单位后释放a的值。
- forever
forever关键字用于创建一个无限循环。在Verilog中,forever通常与always语句一起使用,用于重复执行一段代码块。以下是一个简单的forever语句示例:
always @(posedge clk)
forever begin
// 重复执行的代码块
end
在这个示例中,我们使用forever关键字描述了一个无限循环,在时钟上升沿触发时重复执行代码块。
- fork
fork关键字用于创建一个并发执行的代码块。在Verilog中,fork通常与join语句一起使用,用于并发执行多个代码块。以下是一个简单的fork语句示例:
initial begin
fork
// 并发执行的代码块1
// 并发执行的代码块2
join
end
在这个示例中,我们使用fork关键字创建了两个并发执行的代码块,并使用join语句等待两个代码块的执行完成。
- function
function关键字用于创建一个函数。在Verilog中,function通常用于执行特定的计算或操作。以下是一个简单的function语句示例:
function int add(int a, int b);
add = a + b;
endfunction
在这个示例中,我们使用function关键字创建了一个add函数,用于计算两个整数的和。
- highz0
highz0关键字用于描述数字电路中的高阻态。在Verilog中,highz0通常用于描述三态门的输出。以下是一个简单的highz0语句示例:
assign out = (enable) ? data : highz0;
在这个示例中,我们使用highz0关键字描述了三态门的输出,在enable信号为1时输出data信号,在enable信号为0时输出高阻态。
- highz1
highz1关键字用于描述数字电路中的高阻态。在Verilog中,highz1通常用于描述三态门的输出。以下是一个简单的highz1语句示例:
assign out = (enable) ? data : highz1;
在这个示例中,我们使用highz1关键字描述了三态门的输出,在enable信号为1时输出data信号,在enable信号为0时输出高阻态。
- if
if关键字用于描述条件语句。在Verilog中,if语句通常用于根据某个条件执行特定的代码块。以下是一个简单的if语句示例:
if (a > b) begin
// 条件成立时执行的代码块
end else begin
// 条件不成立时执行的代码块
end
在这个示例中,我们使用if语句判断a是否大于b,如果成立,执行条件成立时的代码块,否则执行条件不成立时的代码块。
- ifnone
ifnone关键字用于描述默认值。在Verilog中,ifnone通常用于描述信号的默认值。以下是一个简单的ifnone语句示例:
assign out = ifnone(in, 0);
在这个示例中,我们使用ifnone关键字描述了信号in的默认值为0,如果in信号没有被赋值,out信号将被赋值为0。
- initial
initial关键字用于描述初始化代码块。在Verilog中,initial语句通常用于初始化数字电路的状态。以下是一个简单的initial语句示例:
initial begin
// 初始化代码块
end
在这个示例中,我们使用initial关键字描述了一个初始化代码块,用于初始化数字电路的状态。
- inout
inout关键字用于描述双向信号。在Verilog中,inout通常用于描述三态门的输入和输出。以下是一个简单的inout语句示例:
module tri_gate(inout out, input enable, input data);
assign out = (enable) ? data : 1'bz;
endmodule
在这个示例中,我们使用inout关键字描述了三态门的输入和输出信号out,当enable信号为1时,输出data信号,否则输出高阻态。
- input
input关键字用于描述输入信号。在Verilog中,input通常用于描述数字电路的输入端口。以下是一个简单的input语句示例:
module adder(input [7:0] a, input [7:0] b, output [7:0] sum);
assign sum = a + b;
endmodule
在这个示例中,我们使用input关键字描述了两个8位输入信号a和b,用于加法运算。
- integer
integer关键字用于描述整数类型。在Verilog中,integer通常用于描述计数器和状态机等数字电路。以下是一个简单的integer语句示例:
module counter(input clk, output reg [7:0] count);
integer i;
always @(posedge clk) begin
if (i == 255) begin
i = 0;
count <= count + 1;
end else begin
i = i + 1;
end
end
endmodule
在这个示例中,我们使用integer关键字定义了一个计数器变量i,用于计数,每当i等于255时,将计数器count加1。
- join
join关键字用于等待并发执行的代码块完成。在Verilog中,join通常与fork语句一起使用,用于等待多个并发执行的代码块的完成。以下是一个简单的join语句示例:
initial begin
fork
// 并发执行的代码块1
// 并发执行的代码块2
join
// 所有并发执行的代码块完成后执行的代码块
end
在这个示例中,我们使用fork关键字创建了两个并发执行的代码块,并使用join语句等待两个代码块的执行完成。
总结
关键字是编程语言中具有特殊含义的保留字,用于表示特定的操作、语句、数据类型等。到此关于Verilog的前40个关键字的作用、特性和用法已经全部介绍完毕。
更多资料 · 微信公众号搜索【CTO Plus】关注后,获取更多,我们一起学习交流。
关于公众号的描述访问如下链接
推荐阅读: