verilog基础语法

顺序块:块中的语句按从前到后一条接一条执行

    begin
    .
    .
    .
    end

并行块:块中的语句同时开始执行

    fork
    .
    .
    .
    join

repeat循环:一个存储器的初始化也可以用repeat

reg [7:0] mem [3:0];
initial begin
    i=0;
    
    repeat(4)
    begin
        mem[i]=0;
        i=i+1;
    end
end

forever循环 :表示 永远循环,直到仿真结束, 与always的区别是,forever 必须在initial或always结构中使用。

initial begin
    clk=0;
    forever #10 clk=~clk;
end

非阻塞性赋值:

特点是:1.同一时间点,前面语句的赋值不能立刻被后面的语句使用。                                                                                                                 2.所以的赋值是在一个时间点结束的时候统一完成的。

如下面的代码,仿真器的执行结果是:

在仿真0时刻,将赋值语句右侧的值0赋给某个临时寄存器中,a并未被赋值。                                                                                                  在仿真0时刻,将赋值语句右侧的值1赋给某个临时寄存器中,b并未被赋值。                                                                                                  在仿真0时刻,将赋值语句右侧的值{a,b}赋给某个临时寄存器中,但是a,b并未真正赋值,所以c得到的是a,b的旧值。                                    在仿真结束时,将临时寄存器的值赋值给左侧。                            

initial begin
    a<=0;
    b<=1;
    c<={a,b};
end

 task任务

task 任务名称;
input [宽度声明] 输入信号名;
output [宽度声明] 输出信号名;
inout [宽度声明] 双向信号名;
reg 任务所用变量声明;

begin
    任务包含的语句   
end

endtask

举例说明,4位全加器的任务

task add4;
input [3:0] x,y;
input cin;
output [3:0] s;
output cout;


begin
    {cout,s}=x+y+cin;  
end

endtask

对任务进行调用,abcde按顺序给x y cin s cout进行赋值

add4(a,b,c,d,e);

函数:函数不可以调用任务,组合逻辑仅可以写成函数,函数至少需要一个输入信号,没有输出信号。

//函数的声明格式
function 返回值的类型和范围 函数名;
input [端口范围] 端口声明;
reg、 interge等变量声明;

begin
    阻塞赋值语句块
end

endfunction

举例说明,计算阶乘的函数

function integer factorial;//定义为整型
input [3:0] a;//定义输入信号
integer i;//定义函数内部变量

begin
    factorial=1;
    for(i=2;i<=a;i=i+1)
      factorial=i*factorial;
end

endfunction

函数的调用

out=function(a);

随机函数

语法形式,seed是一个32位有符号的整型数值

$random(seed);

举例说明,给1024个存储器给随机值

integer i;
reg [7:0] men [0:1023];
initial begin
    i=0;
    repeat(1024)
        begin
            men[i]=$random;
            i=i+1;
        end
end

假如想生成某个范围的数值,得到一个-63——+63的随机数。

rand=$random%64;

可以用以下方法,得到0-63的数值

reg [7:0] rand;
rand={$random}%64;

条件编译指令 `ifdef `else `endif

一般情况下源程序所有的行都要参加编译,但有时候希望对其中的一部分内容只有在满足条件时才进行编译,也就是对一部分内容指定编译的条件,即“条件编译”,当满足条件时对一组语句进行编译,当条件不满足时编译另一部分.

条件编译的几种形式

当宏名已经被定义过,用·define定义,则对程序段1进行编译,否则对程序段2进行编译

`ifdef 宏名(标识符)
        程序段1
        `else
        程序段2
 `endif

其中`else部分可以没有 

`ifdef 宏名(标识符)
        程序段1
 `endif

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值