富豪回路
富豪回路
// div_u8.v module div_u8 ( n, d, q, r ); input [7:0] n, d; output [7:0] q, r; assign q = n / d; assign r = n % d; endmodule // div_8.sflp declare div_u8 interface { input n<8>, d<8>; output q<8>, r<8>; } circuit div_8 { input n<8>, d<8>; output q<8>, r<8>; instrin u(n, d), s(n, d); div_u8 div; instruct u par{ // unsigned div div.n = n; div.d = d; q = div.q; r = div.r; } instruct s par{ // signed div if(n<7>) div.n = -n; else div.n = n; if(d<7>) div.d = -d; else div.d = d; if(n<7>@d<7>) q = -div.q; else q = div.q; if(n<7>) r = -div.r; else r = div.r; } } // div_test.cpp #include<stdio.h> #include "Vdiv_8.h" int main(void) { Vdiv_8 *div = new Vdiv_8; int n, d; unsigned char q, r; for (n = 0; n < 256; n++){ for (d = 1; d < 256; d++){ div->n = n; div->d = d; div->u = 1; div->s = 0; div->eval(); printf("H %02X / %02X = %02X . %02X\n", n, d, div->q, div->r); q = (unsigned char)n / (unsigned char)d; r = (unsigned char)n % (unsigned char)d; printf("U %02X / %02X = %02X . %02X\n", n, d, q, r); if (div->q != q || div->r != r){ printf("err\n"); getchar(); } div->u = 0; div->s = 1; div->eval(); printf("H %02X / %02X = %02X . %02X\n", n, d, div->q, div->r); q = (signed char)n / (signed char)d; r = (signed char)n % (signed char)d; printf("S %02X / %02X = %02X . %02X\n", n, d, q, r); if (div->q != q || div->r != r){ printf("err\n"); getchar(); } printf("\n"); } } div->final(); delete div; return 0; }