Verilog中的关键词,变量和符号介绍

304 阅读3分钟

一、关键词

Verilog是一种用于描述数字电路的硬件描述语言(HDL)。以下是一些常用的Verilog关键词及其用途的简短描述:

  1. module - 用于定义一个模块。模块是Verilog代码的基本单位,它可以包含其它模块,可以类比为C或C++中的函数。

    module my_module(input a, output b);
    ...
    endmodule
    
  2. endmodule - 结束一个模块的定义。

  3. wire - 用于声明一个连线,表示一个组合逻辑信号。

    wire w1;
    
  4. reg - 用于声明一个寄存器,表示一个可存储值的信号。

    reg r1;
    
  5. assign - 用于赋值给连线或组合逻辑的输出。

    assign w1 = a & b;
    
  6. always - 描述逻辑的行为,常用于组合逻辑和时序逻辑。

    always @(a or b) begin
       r1 = a & b;
    end
    
  7. begin & end - 用于定义一个代码块。

  8. if, else - 条件语句。

    if (a) begin
       ...
    end else begin
       ...
    end
    
  9. case, endcase - 多路选择语句。

  10. input, output, inout - 定义模块的输入、输出或双向端口。

  11. initial - 描述仿真开始时执行一次的行为,常用于仿真测试台。

  12. forever - 用于定义一个永远执行的循环,常用于测试台。

  13. fork & join - 用于并行执行多个语句块。

  14. parameter - 定义常量。

parameter SIZE = 8;
  1. function & endfunction - 定义一个函数。

  2. task & endtask - 定义一个任务,与函数类似,但可以执行多个语句并有多个输出。

  3. posedge & negedge - 描述信号的上升沿或下降沿,常用于触发时序逻辑。

always @(posedge clk) begin
   ...
end
  1. display,display**, **write - 用于在仿真中打印输出。

  2. stop** & **finish - 用于终止仿真。

以上是Verilog中一些常见的关键词。实际上,Verilog中有更多的关键词和系统任务,但上述关键词应该为你提供了一个良好的起点。为了真正掌握Verilog,建议深入学习Verilog语言规范和实例,并实际使用仿真工具进行练习。

二、变量和对象

在Verilog中,变量和对象可以被分类为不同的类别,如net、register、port和instance等。以下是对这些类别的简要介绍:

  1. Net

    • 定义:Net是用于描述物理连接的连线,通常用于代表在模块间传递的电信号。
    • 类型:常见的net类型包括wiretritri1tri0wandwor等。
    • 示例
      wire a, b, y;
      assign y = a & b;  // AND操作
      
  2. Register

    • 定义:尽管名为“register”,它并不仅仅是表示寄存器,而是一般的数据存储元素。它们通常不代表物理连接,而是变量或存储元素。
    • 类型:常见的register类型有regintegertimereal等。
    • 示例
      reg [3:0] data;
      always @(posedge clk) begin
        data <= data + 1;  // 4位累加器
      end
      
  3. Port

    • 定义:Port是模块的输入、输出或双向接口。这是模块与外部世界的连接方式。
    • 类型inputoutputinout
    • 示例
      module my_module(input a, input b, output y);
        assign y = a | b;  // OR操作
      endmodule
      
  4. Instance

    • 定义:当您使用某个模块作为另一个模块的组件时,您正在创建该模块的一个实例。每个实例都有自己的状态和行为,独立于其他实例。
    • 示例
      my_module U1(
          .a(in1), 
          .b(in2), 
          .y(out1)
      );  // 'my_module'的实例U1
      

其中,.a 是module U1的实际信号,in1 是外部输入信号;

除上述类别外,还有以下注意点:

  • 逻辑门实例化:您可以直接实例化基本的逻辑门,如and, or, nand等。
  • 数据类型宽度:在声明regwire时,您可以指定其宽度,例如reg [7:0] byte_data表示一个8位宽的寄存器。

三、符号

Verilog是一种用于描述数字电路的硬件描述语言。在Verilog中,存在多个符号,这些符号具有特定的用途。下面是Verilog中常用的符号及其用途:

  1. { } (大括号)

    • 用途:连接(concatenate)。用于将多个位或向量连接在一起。
    • 示例
      reg [3:0] a, b;
      reg [7:0] c;
      c = {a, b}; // 连接a和b形成一个8位的值。
      
  2. [ ] (中括号)

    • 用途:位选择和范围选择。
    • 示例
      reg [7:0] a;
      a[0] = 1;  // 设置a的最低位。
      
  3. @

    • 用途:在always块中,表示在某个事件发生时执行。
    • 示例
      always @(posedge clk or negedge rst)
      
  4. $

    • 用途:表示Verilog的系统任务和函数。
    • 示例
      $display("Hello, World!");
      
  5. %

    • 用途:在系统任务中,例如$display$write中,表示格式化输出。
    • 示例
      $display("Value of a is: %d", a);
      
  6. &

    • 用途:位与操作。
    • 示例
      c = a & b;
      
  7. |

    • 用途:位或操作。
    • 示例
      c = a | b;
      
  8. !

    • 用途:逻辑非操作。
    • 示例
      c = !a;
      
  9. ( )

    • 用途:在表达式中表示优先级。
    • 示例
      c = (a & b) | d;
      
  10. ? :

  • 用途:条件(三元)运算符。
  • 示例
    c = (a > b) ? a : b; // c将被赋值为a和b之间的较大值。
    
  1. ~
  • 用途:位非操作。
  • 示例
    c = ~a;
    
  1. &|^~^
  • 用途:逻辑运算符。分别表示AND、OR、XOR和XNOR。

其他一些符号,如*, 在Verilog中不具有特殊的运算意义,但可能在测试基准或特定的上下文中被使用。