---------- X-Sun-Data-Type: text X-Sun-Data-Description: text X-Sun-Data-Name: text X-Sun-Content-Lines: 27 old mail I sent with a REAL constant function example min. size constant mults. kurt ps. on vaction till sept. 20 (south pacific- yeah!!) ----- Begin Included Message ----- >From kurt Thu Oct 23 22:34:27 1997 Date: Thu, 23 Oct 97 22:34:27 EDT >From: kurt (Kurt Baty) To: btf@boyd.com Subject: BTF contant function example Cc: kurt Content-Type: X-sun-attachment Content-Length: 3476 the function constant_bits in a constant function ----- End Included Message ----- ---------- X-Sun-Data-Type: default X-Sun-Data-Description: default X-Sun-Data-Name: constant_mult.v X-Sun-Content-Lines: 125 module constant_mult(a,product); parameter a_width = 8; parameter const_width = 8; parameter constant = 1; input [a_width-1:0] a; output [a_width+const_width-1:0] product; wire [a_width+const_width-1:0] product; wire [const_width-1:0] constant_wire; assign constant_wire = constant; assign product = a * constant_wire; endmodule --------------------------------------------------------------------------- module #(a_width,const_width,constant) constant_mult(a,product); parameter a_width = 8; parameter const_width = 8; parameter constant = 1; input [a_width-1:0] a; output [a_width+const_width-1:0] product; function integer constant_bits; input integer constant,return_sel; integer bit_value,pos_result,neg_result,count; integer i,j; begin bit_value = constant_wire; pos_result = 0; neg_result = 0; count = 0; for(i=0;i<=const_width;i=i+1) begin if( i <= const_width-3 ) begin if({bit_value[i+2],bit_value[i+1],bit_value[i]} == 3'b111) for(j=i+3;j<=const_width;j=j+1) if(!bit_value[j] && (&{bit_value[j-1],bit_value[j-2],bit_value[j-3]})) begin pos_result[j] = 1'b1; bit_value[j:0] = pos_result[j:0]; neg_result[i] = 1'b1; end else pos_result[i] := bit_value[i]; end else pos_result[i] := bit_value[i]; if(pos_result[i]) count = count + 1; if(neg_result[i]) count = count + 1; end if(|neg_result) count = count + 1; if(return_sel == 1) constant_bits = pos_result; else if(return_sel == 2) constant_bits = neg_result; else constant_bits = count; end endfunction parameter pos_result = constant_bits(constant,1); parameter neg_result = constant_bits(constant,2); parameter count = constant_bits(constant,3); parameter vsum_width = (a_width+const_width); parameter vector_in_width = vsum_width*count; function [vector_in_width-1:0] make_vector_in; input [a_width-1:0] a; integer ptr,i,j,k; reg [vector_in_width-1:0] vector_in; begin ptr = 0; for(i=0;i<=const_width;i=i+1) begin if(neg_result[i]) begin for(j=0;j= i) && (j-i < a_width)) vector_in[ptr*vsum_width+j] = !a[j-i]; else if(j >= a_width) vector_in[ptr*vsum_width+j] = 1'b1; end ptr := ptr + 1; end if(pos_result[i]) begin for(j=0;j= i) && (j-i < a_width)) vector_in[ptr*vsum_width+j] = a[j-i]; else if(j >= a_width) vector_in[ptr*vsum_width+j] = 1'b0; end ptr := ptr + 1; end end for(k=0;k const_width) vector_in[ptr*vsum_width+k] = 1'b0; end make_vector_in = vector_in; end endfunction wire [vsum_width-1:0] product; wire [vector_in_width-1:0] vector_in; assign vector_in = make_vector_in(a); DW02_sum #(count,vsum_width) vsum(vector_in,product); endmodule