侧边栏壁纸
    • 累计撰写 296 篇文章
    • 累计收到 521 条评论
    【1】Verilog-初识、简介与环境搭建
    我的学记|刘航宇的博客

    【1】Verilog-初识、简介与环境搭建

    刘航宇
    2022-05-14 / 0 评论 / 294 阅读 / 正在检测是否收录...

    Verilog 具有很强的电路描述与建模能力,能从多个层次对数字系统进行描述和建模。因此,在简化硬件设计任务、提高设计效率与可靠性、语言易读性、层次化和结构化设计等方面展现了强大的生命力与潜力。

    发展历史

    1983 年,Verilog 最初由 Gateway Design Automation 公司(GDA)的 Phil Moorby 创建,作为内部仿真器的语言,主要用于逻辑建模和仿真验证,被广泛使用。
    1989 年,GDA 公司被 Cadence 公司收购,Verilog 语言成为 Cadence 公司的私有财产。
    1990 年,Cadence 公司成立 OVI(Open Verilog International)组织,公开 Verilog 语言,促进 Verilog 向公众领域发展。
    1992 年,OVI 决定致力于将 Verilog OVI 标准推广为 IEEE(The Institute of Electrical and Electronics Engineers)标准。
    1995 年,OVI 的努力获得成功,IEEE 制定了 Verilog HDL 的第一个国际标准,即 IEEE Std 1364-1995,也称之为 Verilog 1.0。
    2001 年,IEEE 发布 Verilog 第二个标准(Verilog 2.0),即 IEEE Std 1364-2001, 简称为 Verilog-2001 标准。由于 Cadence 在集成电路设计领域的影响力及 Verilog 语言的简洁易用性,Verilog 成为电路设计中最流行的硬件描述语言。

    主要特性

    下面是 Verilog 的主要特性:

    可采用 3 种不同的方式进行设计建模:行为级描述——使用过程化结构建模;数据流描述——使用连续赋值语句建模;结构化方式——使用门和模块例化语句描述。
    两类数据类型:线网(wire)数据类型与寄存器(reg)数据类型,线网表示物理元件之间的连线,寄存器表示抽象的数据存储元件。
    能够描述层次设计,可使用模块实例化描述任何层次。
    用户定义原语(UDP)创建十分灵活。原语既可以是组合逻辑,也可以是时序逻辑。
    可提供显示语言结构指定设计中的指定端口到端口的时延,以及路径时延和时序检查。
    Verilog 支持其他编程语言接口(PLI)进行进一步扩展。PLI 允许外部函数访问 Verilog 模块内部信息,为仿真提供了更加丰富的测试方法。
    同一语言可用于生成模拟激励和指定测试的约束条件。
    设计逻辑功能时,设计者可不用关心不影响逻辑功能的因素,例如工艺、温度等。

    主要应用

    专用集成电路(ASIC),就是具有专门用途和特殊功能的独立集成电路器件。

    Verilog 作为硬件描述语言,主要用来生成专用集成电路。

    主要通过 3 个途径来完成:

    1、可编程逻辑器件

    FPGA 和 CPLD 是实现这一途径的主流器件。他们直接面向用户,具有极大的灵活性和通用性,实现快捷,测试方便,开发效率高而成本较低。

    2、半定制或全定制 ASIC

    通俗来讲,就是利用 Verilog 来设计具有某种特殊功能的专用芯片。根据基本单元工艺的差异,又可分为门阵列 ASIC,标准单元 ASIC,全定制 ASIC。

    3、混合 ASIC

    主要指既具有面向用户的 FPGA 可编程逻辑功能和逻辑资源,同时也含有可方便调用和配置的硬件标准单元模块,如CPU,RAM,锁相环,乘法器等。

    Verilog 环境搭建

    学习 Verilog 做仿真时,可选择不同仿真环境。FPGA 开发环境有 Xilinx 公司的 ISE(目前已停止更新),VIVADO;因特尔公司的 Quartus II;ASIC 开发环境有 Synopsys 公司的 VCS ;很多人也在用 Icarus Verilog 和 GTKwave 的方法,更加的轻便。

    虽然 ISE 或者 Quartus II 都会自带仿真器,但功能还是有欠缺。所以,这里介绍下 Quartus II + Modelsim 联合仿真的测试方法,运行环境为 64bit-win10 系统。

    Quartus II 安装

    本次介绍使用的 Quartus 版本为 10.1。

    目前 Quartus II 官网已经没有 13.1 以下版本的安装包,大家可以安装 13.1 以上版本的软件。功能都是大同小异,下载地址:https://fpgasoftware.intel.com/13.1/?edition=subscription&platform=windows

    下载 13.1 以上的 quartus II 时,官网也会推荐相应版本的 Modelsim,一起下载即可。

    开始安装,修改安装路径,其他按照默认设置一步步操作即可。

    下图是成功安装的截图。

    如果提示需要 License file,如下图所示,则需要指定购买该软件时的 license 文件。

    如果 license 文件需要替换 Host-ID,只需要 license 文件中的 HOSTID 替换为 NIC 选项中随便一个 ID 即可,如下图红色框所示:
    l35kw97h.png

    Quartus II 10.1 安装完还需要安装 Device,即安装支持各种可编程逻辑器件型号的库文件,否则 Quartus II 不能正常建立工程。

    安装路径需要选择 Quartus II 的安装路径,此时 Device 安装可自动识别 Quartus II。

    最新 Quartus II(例如 2016 版本)已经支持一套化安装了。

    Modelsim 安装

    Modelsim 选择 modelsim-win64-10.1c-se 版本。

    也需要修改下安装路径,然后按照默认设置进行操作即可。

    安装完毕后可能提示需要重启电脑,重启即可。
    l35kwto3.png

    建立 Quartus II 工程

    建立工程

    File->New project Wizard

    设置工作路径与工程名字、top module名字。

    注意,路径与名字设置时,不能包含中文。
    l35kymsh.png
    选择器件型号

    我们只进行简单的仿真,不进行下载、烧录等,所以我们不用关心具体信号,随便选一种即可。

    然后一直点击 Next,直到 Finish。
    l35kz8mf.png

    新建 Verilog 源文件

    下面就对 4 位宽 10 进制计数器进行简单的仿真。

    点击:File->New->Verilog HDL File->OK

    点击:File->Save As

    输入 module 名字为:counter10.v

    需要注意的是,top module 名字一定要和 project 名字一致,否则会报错(如图中所示)。

    把 Verilog 代码复制到文件 counter10.v 中,进行一键编译(实际包含了编译、综合、布局布线等)。
    代码:

    module counter10(
            //端口定义
            input                   rstn,   //复位端,低有效
            input                   clk,    //输入时钟
            output [3:0]    cnt,    //计数输出
            output                  cout);  //溢出位
    
            reg [3:0]               cnt_temp ;      //计数器寄存器
            always@(posedge clk or negedge rstn) begin
                    if(! rstn)begin         //复位时,计时归0
                            cnt_temp        <= 4'b0 ;
                    end
                    else if (cnt_temp==4'd9) begin  //计时10个cycle时,计时归0
                            cnt_temp        <=4'b000;
                    end
                    else begin                                      //计时加1
                            cnt_temp        <= cnt_temp + 1'b1 ;
                    end
            end
    
            assign  cout = (cnt_temp==4'd9) ;       //输出周期位
            assign  cnt  = cnt_temp ;                       //输出实时计时器
    
    endmodule

    报错时,可通过点击 Error log 来定位错误,进行修改,直至没有 Error。
    l35kzvy2.png

    Quartus II 调用 Modelsim 仿真

    仿真设置为 Modelsim-altera

    点击:Tool->Options->EDA Tool Options

    将 Modelsim 后面的地址改为 Modelsim 启动程序的路径。
    l35l1p4j.png
    选择仿真器

    点击:Assignments -> Simulation

    Tool name 选择 ModelSim,并设置 Format、Time scale 等,如图
    l35l22b6.png
    写 testbench 文件

    点击:Processing->start->Start TestBench Template Writer

    如果设置正确,会在工程路径 simulation/modelsim 下产生 .vt 文件。

    .vt 文件模板已经给出了端口部分的代码、接口变量的声明和例化语句映射等。我们要做的就是将测试代码填入到 testbench 合适的位置。

    这里简单的写一下时钟、复位驱动代码,如下图所示。
    l35l2is4.png
    将 testbench 添加到工程中

    点击:Assignments -> Settings -> Simulation

    在 Compile test bench 选项中,选择 new,设置 Test bench name,并通过 File name 查找的方式,将上一步生成的 .vt 文件添加到工程中。

    需要注意的是,testbench 文件名字需要和 testbench 里的 top module 名字保持一致,否则后续启动 Modelsim 时会报错,不能进行正常的仿真。
    l35l2w7o.png
    重新一键编译

    此时,你会发现,Tasks 栏编译的状态变成了问号,需要重新进行一键编译。
    l35l3k7f.png
    调用 Modelsim 仿真

    点击:Tools->Run simulation Tool->RTL Simulation

    这时就会自动启动 Modelsim 软件。

    Modelsim 操作这里不做具体介绍。

    由仿真图可知,我们的设计完成了 10 进制计数的基本功能。
    l35l42j9.png

    总结

    记忆中,Quartus II + Modelsim 的联合仿真功能既强大,又安装方便。几年后重新进行此过程,发现步骤也有些许繁琐,花费了我一晚上的时间来搞定。很多细节也在上面提出,多多注意就好。不过,大家以后有机会进行大型的数字模块仿真时,就会发现此方法的有效性。

    在接下来的教程里,有些简单的仿真可能用其他软件进行,截图界面可能与 Modelsim 不一致。大家看到后不用怀疑仿真的准确性,这里特别说明。

    设计模块与 testbench 源码也会全部给出,大家完全可以自己仿真、验证。

    2
    【2】Verilog-项目设计方法
    « 上一篇 2022-05-14
    ASIC/FPGA应该学习Verilog还是VHDL?
    下一篇 » 2022-05-14

    评论 (0)

    取消