跳转至

控制语句

条件语句

if (a > b) out1 = int1;
if (cond)
    语句1;
else
    语句2;
if (cond1)
    语句1;
else if (cond2)
    语句2;
else if (condm)
    语句m;
else
    语句n;

条件语句必须在过程语句中使用 过程语句:由initialalways语句引导的执行语句集合

  • 逻辑表达式为0, x, z按false处理,1按true处理
  • if-else嵌套时需要用begin end包裹(end后不加分号)
  • 允许使用if (exp) if (!exp)

例:

reg[31:0] instruction, segment_area[255:0];
reg[7:0] index;
reg[5:0] modify_seg1, modify_seg2, modify_seg3;
parameter
  segment1 = 0, inc_seg1 = 1,
  segment2 = 20, inc_seg2 = 2,
  segment3 = 64, inc_seg3 = 4,
  data = 128;
if (index < segment2)
begin
  instruction = segment_area[index + modify_seg1];
  index = index + inc_seg1;
end
else if (index < segment3)
begin
  instruction = segment_area[index + modify_seg2];
  index = index + inc_seg2;
end
else if (index < data)
begin
  instruction = segment_area[index + modify_seg3];
  index = index + inc_seg3;
end
else
  instruction = segment_area[index];

多路分支语句

case (exp)
    // 分支项
    分支表达式: 语句;
    default: 语句;
endcase
casez (exp)
    // 分支项
endcase
casex (exp)
    // 分支项
endcase
  • 控制表达式通常表示控制信号的某些位,分支表达式则用这些控制信号的具体状态值来表示(又称为常量表达式)
  • default项至多可有一个
  • case分支表达式的值必须互不相同,执行完后即跳出该结构
  • 在用case语句表达式进行比较的过程中,信号的对应值需能明确进行比较
  • case语句所有表达式的值的位宽必须相等,需指明n'bx n'bz
  • casez将z视为不必关心的情况,casex将z, x视为不必关心的情况

例:

// 译码器
reg [15:0] rega;
reg [9:0] regb;
case(rega)
    16'd0: result = 10'b0111111111;
    16'd1: result = 10'b1011111111;
    16'd2: result = 10'b1101111111;
    16'd3: result = 10'b1110111111;
    16'd4: result = 10'b1111011111;
    16'd5: result = 10'b1111101111;
    16'd6: result = 10'b1111110111;
    16'd7: result = 10'b1111111011;
    16'd8: result = 10'b1111111101;
    16'd9: result = 10'b1111111110;
    default: result = 10'bx;
endcase

case (select[1:2])
  2'b00:
    result = 0;
  2'b01:
    result = flaga;
  2'b0x, 2'b0z:
    result = flaga ? 'bx : 0;
  2'b10:
    result = flagb;
  2'bx0, 2'bz0:
    result = flagb ? 'bx : 0;
  default:
    result = 'bx;
endcase
reg[7:0] ir;
casez(ir)
    8'b1???????: instrction1(ir);
    8'b01??????: instrction2(ir);
    8'b00010???: instrction3(ir);
    8'b000001??: instrction4(ir);
endcase
reg[7:0] r, mask;
mask = 8'bx0x0x0x0;
casex(r^mask)
    8'b001100xx: stat1;
    8'b1100xx00: stat2;
    8'b00xx0011: stat3;
    8'bxx001100: stat4;
endcase

注:锁存器问题

  • 原因:always块中变量保持原值,生成锁存器
  • 出现情况:
    • 在给定的条件下变量没有赋值
    • case语句缺少default项
  • 解决:
    • if最好带else
    • case最好带default

循环语句

forever语句:连续的执行语句

forever 语句;

forever begin
    语句;
end
  • 常用于产生周期性的波形用作仿真测试信号

不能独立写在程序中,必须写在initial块中

repeat语句:连续执行一条语句n次

repeat(表达式) 语句;

repeat(表达式) begin
    语句;
end
  • 表达式多为常量

例:

parameter size = 8, longsize = 16;
reg [size:1] opa, opb;
reg [longsize:1] result;
begin: mult
    reg [longsize:1] shift_opa, shift_opb;
    shift_opa = opa;
    shift_opb = opb;
    result = 0;
    repeat(size) begin
        if (shift_opb[1]) result = result + shift_opa;
        shift_opa = shift_opa << 1;
        shift_opb = shift_opb >> 1;
    end
end

while语句:执行一条语句直到某个条件不满足

while (表达式) 语句;

while (表达式) begin
    语句;
end

例:

begin: count1s
    reg [7:0] tempreg;
    count = 0;
    tempreg = rega;
    while (tempreg) begin
        if (tempreg[0]) count = count + 1;
        tempreg = tempreg >> 1;
    end
end

for语句:同C语言

例:

begin: init_mem
    reg [7:0] tempi;
    for (tempi = 0; tempi < memsize; tmepi = tempi + 1)
        memory[tempi] = 0;
end