结构语句

总述:

  • 一个程序可以有多个initialalways块,每个initialalways说明语句在仿真一开始就立即执行

    • initial只执行一次
    • always不断重复活动直到仿真结束,若触发条件满足则执行过程块一次

      initialalways语句次数不受限制,同时开始运行

  • task, function可以在程序模块中一处或多出调用

initial说明语句:

initial begin
    语句1;
    语句2;
end

例:存储器变量赋初值

initial begin
    areg = 0;
    for (index = 0; index < size; index = index + 1) memory[index] = 0;
end

例:激励波形生成

initial begin
    inputs = 'b000000;
    #10 inputs = 'b011001;
    #10 inputs = 'b011011;
end

  • 一个模块可以有多个initial块,并行运行
  • initial块常用于测试文件和虚拟模块的编写,用来产生仿真测试信号和设置信号记录等仿真环境

always说明语句:

always <时序控制> <语句>

沿触发:or关键字连接(可使用,代替),只要其中一个沿出现就执行过程块

always @ (posedge clock or posedge reset) begin

end

  • 常描述时序行为(如有限状态机)

电平触发:只要其中任何一个电平发生变化(由高到低/由低到高),就执行过程块

always @ (a or b or c) begin

end

  • 常描述组合逻辑行为

    多个always块并没有前后之分:若可综合,则描述某种结构;若不可综合,则描述电路结构的行为

@*操作符:表示对其后块语句中所有输入变量的变化敏感

always @ (*) begin
    out 1 = a ? (b + c) : (d + e);
    out 2 = f ? (g + h) : (p + m);
end

wait关键字:电平敏感时序控制,等待电平敏感条件为真才执行(而不仅仅是发生改变)

always wait(count_enable) #20 count = count + 1;

例:仿真死锁

always areg = ~areg;

例:时钟信号

  • 发生
    always #half_period areg = ~areg;
    
  • 利用
    reg [7:0] counter;
    reg tick;
    always @ (posedge areg) begin
        tick = ~tick;
        counter = counter + 1;
    end