Uses Euclid's Algorithm to iteratively find the greatest common divisor of two signed integers, A and B, of up to 32 bits. This is not mean for synthesis!
Reference: Wikipedia: Euclidean Algorithm
Bring in the function at the start of the body of your module like so:
`include "gcd_function.vh"
Pass the function values which, at elaboration time, are either constant or expressions which evaluates to constants. Then use the output value as an integer for a localparam, genvar, etc...
We use a temp values for calculations since Vivado raises warnings if we internally assign a value to a function input port.
Since this is an included file, it must be idempotent. (defined only once globally)
`ifndef GCD_FUNCTION `define GCD_FUNCTION `include "abs_function.vh" function integer gcd; input integer A; input integer B; integer A_tmp; integer B_tmp; integer tmp; begin A_tmp = A; B_tmp = B; while ( B_tmp != 0) begin tmp = B_tmp; B_tmp = A_tmp % B_tmp; A_tmp = tmp; end gcd = abs(A_tmp); end endfunction `endif