Re: [myhdl-list] intbv addition
Brought to you by:
jandecaluwe
From: Christopher L. F. <chr...@gm...> - 2009-06-06 21:33:22
|
> Dear Chris, > > Thank you for your reply. I am trying to add numbers in MyHDL, I tried > to add numbers modeled by 'intbv' in two stages; the first was simple > program with no 'next' command included, and the other with 'next'. > The first one worked as expected but the second one strangely gave > weird results, when the numbers are positive, but when they are > extended to negative ranges the interpreter complains about exceeding > the minimum range of 0. Here is the code: > > from myhdl import Signal, delay, always, intbv, Simulation, bin > from random import randrange > from math import pow > > def AddNum(B): > > #interval = delay(10) > max_num = pow(2,B-1) - 1 > min_num = -1 * pow(2,B-1) > > a = Signal(intbv(0)[B:]) > b = Signal(intbv(0)[B:]) > c = Signal(intbv(0)[B+1:]) > > The error you are seeing is correct. There is basically two modes for the intbv. Constraint integer (see Jan's essay for more info) and the regular bit-vector. When using the intbv for integer representation, as in your case with negative and positive numbers, you need to define the maximum and minimum. Instead of defining the number of bits you only need to define the expected max and min for the design. Example a = Signal(intbv(0, min=min_num, max=max_num)) b = Signal(intbv(0, min=min_num, max=max_num)) c = Signal(intbv(0, min=min_num, max=max_num)) This is a little different than what you maybe use to in Verilog or VHDL but it can be very powerful. When you define the bit width it is expected that the intbv is used as a generic bit array (no numeric value). But the implicit numeric min is zero and the max is the size of the bit vector. Hope that helps > for i in range(10): > > a.next = randrange(0, max_num) > b.next = randrange(0, max_num) > c.next = a + b > > yield delay(10) > print "i: %s a: %s, b: %s sum = %s binary %s" %(i, a, b, c, bin(c, B)) > > > def main(): > bitwidth = 9 > inst = AddNum(bitwidth) > sim = Simulation(inst) > sim.run() > > > if __name__ == '__main__': > main() > > As I said, when negative numbers are used, i.e. > > a.next = randrange(min_num, max_num) > b.next = randrange(min_num, max_num) > > Python complains. What do you think is the problem? > > On Sat, Jun 6, 2009 at 5:34 PM, Christopher L. > Felton<chr...@gm...> wrote: > >>> a=intbv(3)[2:] >>> b=intbv(1)[2:] >>> c=a+b >>> >>> the sum (c) is not 'intbv' class, its 'long' if I'm not mistaken. How >>> can we get the sum to be 'intbv' of the same bitwidth (in this case >>> 2)? >>> >>> >>> >> You would want to do the following (which is the same as other HDLs) >> >> a = intbv(3)[2:] >> b = intbv(1)[2:] >> c = intbv(1)[2:] >> c[:] = a+b >> >> As you noticed, the result of the intbv math operations returns an >> integer (long). What you need to do is create an intbv type for the >> left hand side of the operation. For the above example you will get an >> error. The intbv will check the limits of addition. You will need to >> create "c" to be large enough for the result of the addition. >> >> c = intbv(1)[3:] >> >> >> Hope that helps, for more background information see Jan's essay on >> constraint integer, http://www.jandecaluwe.com/hdldesign/counting.html. >> >> Chris >> >> ------------------------------------------------------------------------------ >> OpenSolaris 2009.06 is a cutting edge operating system for enterprises >> looking to deploy the next generation of Solaris that includes the latest >> innovations from Sun and the OpenSource community. Download a copy and >> enjoy capabilities such as Networking, Storage and Virtualization. >> Go to: http://p.sf.net/sfu/opensolaris-get >> _______________________________________________ >> myhdl-list mailing list >> myh...@li... >> https://lists.sourceforge.net/lists/listinfo/myhdl-list >> >> > > > > |