zoukankan      html  css  js  c++  java
  • Verilog基础语法总结

    去年小学期写的,push到博客上好了

    Verilog 的基本声明类型

    wire w1; // 线路类型

    reg [-3:4] r1; // 八位寄存器

    integer mem[0:2047]; // 2048 个整数的阵列

    reg [31:0] cache[0:63]; // 32 数据的64个存储单元

    //通常称为内存或记忆体

    //更多阵列类型的声明

    reg [7:0] array [0:1023];

    reg [7:0] array [0:1023][0:511];

    module里的声明类型

    parameter 参数声明

    port      脚位声明  

    基本语法

    `define 常数名 数字

    //定义一个宏常量,引用方法是:`常数名

    //其中数字的格式为:x’(b/h/d)x位数

    //b是二进制,h16进制,d10进制

    #10  <item>

    //经过10个时延单位执行后面的程式

    `timescale 1ns/10ns

    //定义时延单位

    `include”<name>.v”

    //将工作目录下的该文件的内容扩充到本文件中

    //注意是工作目录,include其他路径下的文件是不行的

    module <模组名>(参数列表);

    endmodule

    //声明一个模块

    assign

    //主要用来描述组合逻辑

    //always语句块相比较不必强制使等号左边的数必须为寄存器类型

    //等号左边可以是wireregoutput

    //两种 Assign Blocking v.s. Nonblocking

    //a = b ; // Blocking assignment : 执行顺序不一定,

    //a <= b; // Nonblocking assignment : 所有可同时执行的东西都执行完一次后,才会前进到下//一个时间点。

    Always

    //声明一个语句块

    //用法一 always #时延 语句

    //用法二 always @(posedge clk)

    //clk信号处于上升沿的时候要执行的语句块

    //这里posedge代表信号的上升沿

    //negedge代表信号的下降沿

    举例说明阻塞式赋值(Blocking)与非阻塞式(Non-Blocking)赋值的区别

    下面是阻塞式赋值的例子

    reg d1, d2, d3, d4;

    always @(posedge clk) d2 = d1;

    always @(posedge clk) d3 = d2;

    always @(posedge clk) d4 = d3;

    由于这是一门硬件描述语言,语句的声明顺序与执行顺序无关,这样的写法我们是无法得知

    这三条语句的执行顺序的,所以,d2,d3,d4的结果都将是不固定的

    下面是非阻塞式赋值的例子

    reg d1, d2, d3, d4;

    always @(posedge clk) d2 <= d1;

    always @(posedge clk) d3 <= d2;

    always @(posedge clk) d4 <= d3;

    因为可以同时执行的事件都执行完一次之后才会执行下一时间点的事件,所以d2,d3,d4会得到上一轮的d1,d2,d3

    下面仍然是一个阻塞式赋值的例子

    a = 1;

    b = a;

    c = b;

    执行结果相当于a=1,b=1,c=1;

    下面是一个非阻塞式赋值的例子

    a <= 1;

    b <= a;

    c <= b;

    执行结果相当于a=1;b=上一轮a的值;c=上一轮b的值

    //

    initial语句块:常用于testbench实时赋值

    initial

    begin

    // 程序

    end

    //当模拟一开始会被执行

    //end会结束

    系统函数与常量

     $readmemh("cpu0s.hex", m);

    将对应的文件写到m这个阵列里面

    $time是显示执行时间的常量,其单位是ns

    $display(“printf的格式控制符”,输出参数列表);

    $monitor的语法完全类似

    verilog中所有变量都是全局变量,例如

    module top;

      integer myglobalvar;

    endmodule

    module any;

      initial $display(top.myglobalvar);

    Endmodule

    关于模组内模块的合法性说明

    module <module name> (<port list>);

    <declares>

    <module items>

    endmodule

    其中的 <module items> 可能是以下类型的语句:

    1. initial

    2. always

    3. assign

    4. module 实例

    基本语句说明-分支语句

    1.简易分支

    f = sel ? a : b; // 右邊的任何改變都會引發左邊的重新計算

    2.IF分支

    if (s == 1'b0)

      y = 0;

    else

      y = 1;

    if (select == 1) y = a;

    else y = b;

    3.case分支

    case ({a,b})

      2'b00: t = 1;

      2'b01: t = 2;

      2'b10: t = 3;

      2'b11: t = 4;

      default: t = 0;

    endcase

    case (op)

      2'b00: y = a + b;

      2'b01: y = a - b;

      2'b10: y = a ˆ b;

      default: y = hxxxx;

    endcase

    4.casez : z当做无关项处理

    casez (f)

      2'b00: y=a+b;

      2'b01: y=a-b;

      2'b10: y=a&b;

      2'b11: y=a^b;

      default: y=0;

    Endcase

    语句说明-循环语句

    1.for

    for (i=0; i<16; i=i+1)

      m[i] = i;

    reg [3:0] i, output;

    for ( i = 0 ; i <= 15 ; i = i + 1 ) begin

      output = i;

      #10;

    End

    2.while

    i=0

    while (i<16) begin

      m[i] = i;

      i = i + 1;

    end

    reg [3:0] i, output;

    i = 0;

    while (i <= 15) begin

      output = i;

      #10 i = i + 1;

    end

    运算式与反运算符

    运算符:~代表取反位运算,!代表取非,^代表异或,+-

    合并运算:

    reg [2:0] a;

    reg [4:0] b;

    {a, b} = 8'b10011110 // 此时会把100a111110b

    reg [15:0] c;

    c = {a, b, {2{a}}, 2'b11} // 此时 c 会是 {a, b, a, a, 11} 衔接后的结果。

    额外的语法说明:{a, 2{b,c}, 3{d}} 相当于 {a, b, c, b, c, d, d, d}

    最后:原则上一通电所有的module都将同时开始工作

  • 相关阅读:
    微软2019暑期实习笔试题
    java中函数传值和传地址的问题
    不常见的机器学习算法
    隐马尔可夫模型
    hive中over的用法
    SQL基本练习
    drop、truncate和delete的区别
    概率函数,分布函数,密度函数
    greenDao:操作数据库的开源框架
    利用百度API Store接口进行火车票查询
  • 原文地址:https://www.cnblogs.com/linkzijun/p/7603735.html
Copyright © 2011-2022 走看看