Veriog_Notes_Chapter 2

来源:互联网 发布:遗传算法 交叉概率 编辑:程序博客网 时间:2024/06/09 16:35

第二章(模块和测试平台概念)

  1. 行为描述语言(system or RTL or algorithm)的功能:并行或顺序、可控延时、可命名事件触发其他过程中的激活或停止、循环结构、可带参数且非零延续时间的task程序结构、函数function、算数,逻辑,位运算符。
    程序基本概念 测试平台
    利用上升沿和下降沿来实现奇数倍分频
module Clk_divided(                                       sys_clk,            clk_out            );// parameter parameter M = 5; parameter N = 3;// IO declaration input sys_clk; output clk_out;// intern  signal definationreg  div1; reg  div2;reg [N-1:0]  cnt1;  reg [N-1:0]  cnt2;// function definationalways@(posedge sys_clk)    begin        if(cnt1==M-1) begin             cnt1 <= 2'b0;end        else begin            cnt1 <= cnt1+2'b1;end         if(cnt1==2'b0) begin            div1<=1; end         if(cnt1==(M-1)/2) begin             div1<=0;    end     endalways@(negedge sys_clk)    begin        if(cnt2==M-1) begin             cnt2 <= 2'b0; end        else begin            cnt2 <= cnt2+2'b1;  end         if(cnt2==2'b0) begin            div2<=1;end         if(cnt2==(M-1)/2) begin             div2<=0;            end     endassign clk_out = div1||div2;  50% clk_5//assign clk_out = div1&&div2;  25% clk_5Endmodule module Clk_divided_tb(sys_clk,clk_out);reg sys_clk ; wire clk_out;clk_divided uut( .sys_clk(sys_clk),              .clk_out(clk_out));initial  beginsys_clk = 0;# 100;  endalways #100 sys_clk =~sys_clk;
  1. endmodule分上升沿和下降沿记奇数个数并分别翻转。例如上升沿计数5个后翻转div1,下降沿计数5个后翻转

div2,div1比div2提前半个时钟周期,最后将div1与div2按位或并赋值给clk_out即得到最5分频后的时钟。
时钟周期200ns,分频后为1us。占空比50%
时钟周期200ns,分频后为1us。占空比25%
思考:非整数倍分频实现思路1、在奇数倍分频的基础上进行2倍分频即可。
3、基本语法使用示例:一位全加器

A   B   C1(前一位进位)   C2(加后进位)      S(和)0   0       0               0           00   1       0               0           10   0       1               0           10   1       1               1           01   0       0               0           11   1       0               1           01   0       1               1           01   1       1               1           1

由此得Verilog程序如下所示:

input A,B,C1,sys_clk,sys_rst;output C2,S;reg sum;reg cout;initial begin sum = 2'b0;cout = 2'b0;end assign C2 = A^~B^~C1; //同或的使用assign S = (B&C1)+A&(B^~C1);Endmodulemodule full_adder_tb;reg A;reg B;reg C1; reg sys_clk;reg sys_rst;wire C2;wire S;    full_adder uut (        .A(A), .B(B),   .C1(C1), .C2(C2),         .S(S), .sys_clk(sys_clk),         .sys_rst(sys_rst)    );    initial begin    A = 0;B = 0;C1 = 0;sys_clk = 0; sys_rst = 0;    #100;    end    always #100 sys_clk = ~sys_clk;    always begin        Fork  //重复执行fork中的语句块    #100 begin A = 0;  B = 1;  C1 = 0; end    #200 begin A = 0;  B = 1;  C1 = 1; end    #300 begin A = 1;  B = 0;  C1 = 0; end    #400 begin A = 1;  B = 1;  C1 = 1; end        join   end    Endmodule

4、测试平台可在行为级(RTL仿真)和逻辑网表(逻辑网表仿真)和门级(门级仿真)结构中进行。其中门级结构加工艺技术再引入延迟模型称为布线后仿真,此时最接近实际电路。
5、initial只执行一次,而always总是在执行。
6、名词理解:synthesize 中(RTL原理图,语法查错,前综合后仿真(功能仿真))、implement中(translate将代码转换为具体的器件,map(器件布局可通过地域约束控制),布线(之后加入延迟信息))。

第三章
1.模块结构:模块端口定义,IO说明,内部信号说明,功能定义。
过程块都是并行执行(initial always)、连续赋值语句(assign)、实例引用语句。无关顺序
2.数据类型:(wire、reg、integer、parameter)最常用。Large medium scalered …16共16种
3.常量:数字,进制有关:注意负数写法:-30’d10、8’h4x(低四位不定)、8’b1100_0011(可读性)“AB”=16’B01000001_01000010 (字符串AB,值为16’h4142),长度默认是32位或64。
4.参数型:parameter average_delay=(r+f)/2 参数型在调用时具有很高的灵活性。定义延迟时间和位宽。
5.变量:网络类型的变量只能被驱动(门,连续赋值语句,assign)等,若无则为高组态。
6.Wire 常为单门驱动,而tri则是多驱动器是的网络数据。Wire或tri在逻辑强度不同时会产生不定值。Wire [N-1:0] a,b;
7.reg 常代表触发器,默认初始值为不定。Always中的每一个信号都必须为reg型。Reg[ N-1:0] a,b;可以正负值。当为操作数时其为无符号值,即当一个4为的寄存器值倍赋值为-1时,运算时将会被当作+15。
memory型即通过reg型建立数组建模,描述ram型存储器、rom储存器、reg文件。Reg[7:0] mema[255:0]; 256个八位储存器,寻址范围0到255。
对mema操作 必须指定位置。如mema[3]=0;
8.算术运算符(+,-, x,/,%)赋值运算(=,<=)关系运算符(<,>,<=,>=)逻辑运算符(&&,||,!)条件运算符(?:)位运算符(~,|,^,&,^~)移位运算符(<<,>>)拼接运算符({})%运算符最后去被除数符号:例如-10%3= -1;

Parameter在实例中的应用优势

module decode(a,f)  Parameter width=1;polarity=1;    ...endmodulemodule top;wire [3:0] a4;wire [4:0] a5;wire[15:0] f16;wire[31:0] f32;decode #(4,0) d1(a4,f16);decode #(5) d1(a5,f32);endmodule

d1得到了来自参数传递过来的值其此时的width和polarity分别为4,0而d2的为5和0。
  不可综合条件:字符串$display,网络类型wire初始化,defparam,deassign,延时(#5),mos开关,双向传输开关,cmos门和电源上下拉,循环语句(forever,while)specify语句和自定义udp元件
一个模块中改变另一个模块中的参数值则需使用defparam命令。(不可综合)

include “top.v” ‘include “block.v”‘include “annotate.v”module test Wire w; top t();endmodulemodule top;wire w;block b1();block b2();endmodule module block;  Parameter p=0;endmodulemodule annotate;  defparam  test.t.b1.p=2; test.t.b2.p=3;endmodule
0 0
原创粉丝点击