其他分享
首页 > 其他分享> > 过程语句

过程语句

作者:互联网

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