控制语句
条件语句¶
条件语句必须在过程语句中使用 过程语句:由
initial
和always
语句引导的执行语句集合
- 逻辑表达式为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];
多路分支语句¶
- 控制表达式通常表示控制信号的某些位,分支表达式则用这些控制信号的具体状态值来表示(又称为常量表达式)
- 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语句:连续的执行语句
- 常用于产生周期性的波形用作仿真测试信号
不能独立写在程序中,必须写在initial块中
repeat语句:连续执行一条语句n次
- 表达式多为常量
例:
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语句:执行一条语句直到某个条件不满足
例:
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语言
例: