过程语句
作者:互联网
7.1 新操作符
verilog中循环递增要写成i=i+1,SV开始允许i++,i--,++i,--i,都属于阻塞赋值,在时序逻辑中慎用,容易出下竞争。
在时序和锁存逻辑块中,如果变量不会被过程块外部语句读取,则可以使用++,--操作符
i++; //可综合
if(--i); //不可综合
sum = i++; //不可综合
简单ALU
package definitions ;
typedef enum logic[2:0]{ADD,SUB,MULT,DIV,SL,SR}opcode_t;
typedef enum logic {UNSIGNED,SIGNED} operand_type_t;
typedef union packed{//联合体,同一时间只能使用一个
logic [23:0] u_data ;
logic singed [23:0] s_data;
}data_t;
typedef struct packed{
opcode_t opc ;
operand_type_t op_type;
data_t op_a;
data_t op_b;
}instruction_t;
endpackage
import definitions::*;//导包
module alu(input instruction_t instr,output data_t alu_out);
always_comb begin
if(instr.op_type == SIGNED) begin
alu_out.s_data = instr.op_a.s_data;
unique case(instr.opc)
ADD : alu_out.s_data += instr.op_b.s_data;
SUB : alu_out.s_data -= instr.op_b.s_data;
MULT: alu_out.s_data *= instr.op_b.s_data;
DIV : alu_out.s_data /= instr.op_b.s_data;
SL : alu_out.s_data <<<= 2;
SR : alu_out.s_data >>>= 2;
endcase
end
else bgin
alu_out.u_data = instr.op_a.u_data;
unique case(instr.opc)
ADD : alu_out.u_data += instr.op_b.u_data;
SUB : alu_out.u_data -= instr.op_b.u_data;
MULT: alu_out.u_data *= instr.op_b.u_data;
DIV : alu_out.u_data /= instr.op_b.u_data;
SL : alu_out.u_data <<<= 2;
SR : alu_out.u_data >>>= 2;
endcase
end
end
endmodule
操作符
inside关键字
logic[2:0]a;
if(a inside {3'b001,3'b010,3'b100})
…………
//等价于
if((a==3'b001)||(a==3'b010)||(a==3'b100))
int d_array[0:1023] ;
if(13 inside d_array)//同样支持
logic [2:0] a;
if(a inside {3'b1?1})//支持?作为无关条件
7.2 操作数改进
SV提供强制类型转换
longint a,y;
read r;
y = a + longint'(r**3);
logic [15:0] a,b,sum
sum = a + 16'(5)//将5转化为16位宽表示
sum = signed'(a) + unsigned'(b)//无实际意义,仅展示signed和unsigned用法
7.3 改进的for循环
SV可直接使用
for(int i=0;i<1024;i++)//不必声明reg或integer类型的计数变量,i只针对此循环有效
检测最低位的1
always_comb begin
ing lo_bit;
for (lo_bit =0;lo_bit <= 63;lo_bit++) begin
if(data[lo_bit]) break;
end
end
7.4 底部检测的 do-while循环
类C语言
7.5 foreach数组循环结构
主要用来对一维和多维数组的元素进行迭代而不必指定数组维度
7.6 跳转语句—break、continue、return
7.8 语句标号
7.9 改进的case语句
unique关键字
- 只有一个条件选项与条件表达式匹配
- 必须有一个条件选项与条件表达式匹配
- 可以忽略条件选项顺序,由软件优化掉选项顺序优先级
priority关键字
- 至少有一个条件选项的值与条件表达式匹配
- 如果由多个条件选项的值与条件表达式匹配,必须执行第一个匹配分支
always_comb
priority case(1'b1)
irq0 : irq = 4'b0001;//具有最高优先级
irq1 : irq = 4'b0010;
irq2 : irq = 4'b0100;
irq3 : irq = 4'b1000;
endcase
改进的if-else
同样由unique和priority修饰
标签:语句,instr,过程,out,logic,alu,data,op 来源: https://www.cnblogs.com/icwangpu/p/16141370.html