|
4 | 4 |
|
5 | 5 | expected_verilog = """ |
6 | 6 | module test; |
7 | | -
|
8 | 7 | reg CLK; |
9 | 8 | reg RST; |
10 | 9 | reg [32-1:0] xdata; |
|
781 | 780 | wire [32-1:0] _tmp_data_0; |
782 | 781 | wire _tmp_valid_0; |
783 | 782 | wire _tmp_ready_0; |
784 | | - wire [32-1:0] _tmp_ldata_0; |
785 | | - wire [32-1:0] _tmp_rdata_0; |
786 | | - assign _tmp_ldata_0 = xdata; |
787 | | - assign _tmp_rdata_0 = ydata; |
788 | | - wire [32-1:0] _tmp_abs_ldata_0; |
789 | | - wire [32-1:0] _tmp_abs_rdata_0; |
790 | | - assign _tmp_abs_ldata_0 = _tmp_ldata_0; |
791 | | - assign _tmp_abs_rdata_0 = _tmp_rdata_0; |
792 | | - wire _tmp_osign_0; |
793 | | - wire [64-1:0] _tmp_abs_odata_0; |
794 | 783 | wire [64-1:0] _tmp_odata_0; |
795 | | - assign _tmp_odata_0 = _tmp_abs_odata_0; |
796 | | - assign _tmp_data_0 = _tmp_odata_0; |
| 784 | + reg [64-1:0] _tmp_data_reg_0; |
| 785 | + assign _tmp_data_0 = _tmp_data_reg_0; |
| 786 | + wire _tmp_ovalid_0; |
| 787 | + reg _tmp_valid_reg_0; |
| 788 | + assign _tmp_valid_0 = _tmp_valid_reg_0; |
797 | 789 | wire _tmp_enable_0; |
798 | 790 | wire _tmp_update_0; |
799 | 791 | assign _tmp_enable_0 = (_tmp_ready_0 || !_tmp_valid_0) && (xready && yready) && (xvalid && yvalid); |
800 | 792 | assign _tmp_update_0 = _tmp_ready_0 || !_tmp_valid_0; |
801 | 793 |
|
802 | | - multiplier |
803 | | - #( |
804 | | - .datawidth(32), |
805 | | - .depth(6) |
806 | | - ) |
| 794 | + multiplier_0 |
807 | 795 | mul0 |
808 | 796 | ( |
809 | 797 | .CLK(CLK), |
810 | 798 | .RST(RST), |
811 | 799 | .update(_tmp_update_0), |
812 | 800 | .enable(_tmp_enable_0), |
813 | | - .valid(_tmp_valid_0), |
814 | | - .a(_tmp_abs_ldata_0), |
815 | | - .b(_tmp_abs_rdata_0), |
816 | | - .c(_tmp_abs_odata_0) |
| 801 | + .valid(_tmp_ovalid_0), |
| 802 | + .a(xdata), |
| 803 | + .b(ydata), |
| 804 | + .c(_tmp_odata_0) |
817 | 805 | ); |
818 | 806 |
|
819 | | - reg _tmp_sign0_0; |
820 | | - reg _tmp_sign1_0; |
821 | | - reg _tmp_sign2_0; |
822 | | - reg _tmp_sign3_0; |
823 | | - reg _tmp_sign4_0; |
824 | | - reg _tmp_sign5_0; |
825 | | - assign _tmp_osign_0 = _tmp_sign5_0; |
826 | 807 | assign xready = (_tmp_ready_0 || !_tmp_valid_0) && (xvalid && yvalid); |
827 | 808 | assign yready = (_tmp_ready_0 || !_tmp_valid_0) && (xvalid && yvalid); |
828 | | - assign _tmp_ready_0 = (_tmp_ready_7 || !_tmp_valid_7) && _tmp_valid_0; |
| 809 | + assign _tmp_ready_0 = (_tmp_ready_8 || !_tmp_valid_8) && _tmp_valid_0; |
829 | 810 | reg [32-1:0] _tmp_data_1; |
830 | 811 | reg _tmp_valid_1; |
831 | 812 | wire _tmp_ready_1; |
|
850 | 831 | reg [32-1:0] _tmp_data_6; |
851 | 832 | reg _tmp_valid_6; |
852 | 833 | wire _tmp_ready_6; |
853 | | - assign _tmp_ready_6 = 1; |
| 834 | + assign _tmp_ready_6 = (_tmp_ready_7 || !_tmp_valid_7) && _tmp_valid_6; |
854 | 835 | reg [32-1:0] _tmp_data_7; |
855 | 836 | reg _tmp_valid_7; |
856 | 837 | wire _tmp_ready_7; |
857 | | - assign zdata = _tmp_data_7; |
858 | | - assign zvalid = _tmp_valid_7; |
859 | | - assign _tmp_ready_7 = zready; |
| 838 | + assign _tmp_ready_7 = 1; |
| 839 | + reg [32-1:0] _tmp_data_8; |
| 840 | + reg _tmp_valid_8; |
| 841 | + wire _tmp_ready_8; |
| 842 | + assign zdata = _tmp_data_8; |
| 843 | + assign zvalid = _tmp_valid_8; |
| 844 | + assign _tmp_ready_8 = zready; |
860 | 845 |
|
861 | 846 | always @(posedge CLK) begin |
862 | 847 | if(RST) begin |
863 | | - _tmp_sign0_0 <= 0; |
864 | | - _tmp_sign1_0 <= 0; |
865 | | - _tmp_sign2_0 <= 0; |
866 | | - _tmp_sign3_0 <= 0; |
867 | | - _tmp_sign4_0 <= 0; |
868 | | - _tmp_sign5_0 <= 0; |
| 848 | + _tmp_data_reg_0 <= 0; |
| 849 | + _tmp_valid_reg_0 <= 0; |
869 | 850 | _tmp_data_1 <= 0; |
870 | 851 | _tmp_valid_1 <= 0; |
871 | 852 | _tmp_data_2 <= 0; |
|
880 | 861 | _tmp_valid_6 <= 0; |
881 | 862 | _tmp_data_7 <= 0; |
882 | 863 | _tmp_valid_7 <= 0; |
| 864 | + _tmp_data_8 <= 1'd0; |
| 865 | + _tmp_valid_8 <= 0; |
883 | 866 | end else begin |
884 | 867 | if(_tmp_ready_0 || !_tmp_valid_0) begin |
885 | | - _tmp_sign0_0 <= (_tmp_ldata_0[31] == 0) && (_tmp_rdata_0[31] == 0) || (_tmp_ldata_0[31] == 1) && (_tmp_rdata_0[31] == 1); |
886 | | - end |
887 | | - if(_tmp_ready_0 || !_tmp_valid_0) begin |
888 | | - _tmp_sign1_0 <= _tmp_sign0_0; |
889 | | - end |
890 | | - if(_tmp_ready_0 || !_tmp_valid_0) begin |
891 | | - _tmp_sign2_0 <= _tmp_sign1_0; |
| 868 | + _tmp_data_reg_0 <= _tmp_odata_0; |
892 | 869 | end |
893 | 870 | if(_tmp_ready_0 || !_tmp_valid_0) begin |
894 | | - _tmp_sign3_0 <= _tmp_sign2_0; |
895 | | - end |
896 | | - if(_tmp_ready_0 || !_tmp_valid_0) begin |
897 | | - _tmp_sign4_0 <= _tmp_sign3_0; |
898 | | - end |
899 | | - if(_tmp_ready_0 || !_tmp_valid_0) begin |
900 | | - _tmp_sign5_0 <= _tmp_sign4_0; |
| 871 | + _tmp_valid_reg_0 <= _tmp_ovalid_0; |
901 | 872 | end |
902 | 873 | if((_tmp_ready_1 || !_tmp_valid_1) && resetready && resetvalid) begin |
903 | 874 | _tmp_data_1 <= resetdata; |
|
953 | 924 | if((_tmp_ready_6 || !_tmp_valid_6) && _tmp_ready_5) begin |
954 | 925 | _tmp_valid_6 <= _tmp_valid_5; |
955 | 926 | end |
956 | | - if(_tmp_valid_6 && _tmp_ready_6) begin |
| 927 | + if((_tmp_ready_7 || !_tmp_valid_7) && _tmp_ready_6 && _tmp_valid_6) begin |
957 | 928 | _tmp_data_7 <= _tmp_data_6; |
958 | 929 | end |
959 | | - if((_tmp_ready_7 || !_tmp_valid_7) && _tmp_ready_0 && _tmp_valid_0) begin |
960 | | - _tmp_data_7 <= _tmp_data_7 + _tmp_data_0; |
961 | | - end |
962 | 930 | if(_tmp_valid_7 && _tmp_ready_7) begin |
963 | 931 | _tmp_valid_7 <= 0; |
964 | 932 | end |
965 | | - if((_tmp_ready_7 || !_tmp_valid_7) && _tmp_ready_0) begin |
966 | | - _tmp_valid_7 <= _tmp_valid_0; |
| 933 | + if((_tmp_ready_7 || !_tmp_valid_7) && _tmp_ready_6) begin |
| 934 | + _tmp_valid_7 <= _tmp_valid_6; |
| 935 | + end |
| 936 | + if(_tmp_valid_7 && _tmp_ready_7) begin |
| 937 | + _tmp_data_8 <= _tmp_data_7; |
| 938 | + end |
| 939 | + if((_tmp_ready_8 || !_tmp_valid_8) && _tmp_ready_0 && _tmp_valid_0) begin |
| 940 | + _tmp_data_8 <= _tmp_data_8 + _tmp_data_0; |
| 941 | + end |
| 942 | + if(_tmp_valid_8 && _tmp_ready_8) begin |
| 943 | + _tmp_valid_8 <= 0; |
| 944 | + end |
| 945 | + if((_tmp_ready_8 || !_tmp_valid_8) && _tmp_ready_0) begin |
| 946 | + _tmp_valid_8 <= _tmp_valid_0; |
967 | 947 | end |
968 | 948 | end |
969 | 949 | end |
|
973 | 953 |
|
974 | 954 |
|
975 | 955 |
|
976 | | -module multiplier # |
977 | | -( |
978 | | - parameter datawidth = 32, |
979 | | - parameter depth = 6 |
980 | | -) |
| 956 | +module multiplier_0 |
981 | 957 | ( |
982 | 958 | input CLK, |
983 | 959 | input RST, |
984 | 960 | input update, |
985 | 961 | input enable, |
986 | 962 | output valid, |
987 | | - input [datawidth-1:0] a, |
988 | | - input [datawidth-1:0] b, |
989 | | - output [datawidth*2-1:0] c |
| 963 | + input [32-1:0] a, |
| 964 | + input [32-1:0] b, |
| 965 | + output [64-1:0] c |
990 | 966 | ); |
991 | 967 |
|
992 | | - reg [depth-1:0] valid_reg; |
993 | | - assign valid = valid_reg[depth - 1]; |
994 | | - integer i; |
| 968 | + reg valid_reg0; |
| 969 | + reg valid_reg1; |
| 970 | + reg valid_reg2; |
| 971 | + reg valid_reg3; |
| 972 | + reg valid_reg4; |
| 973 | + reg valid_reg5; |
| 974 | + assign valid = valid_reg5; |
995 | 975 |
|
996 | 976 | always @(posedge CLK) begin |
997 | 977 | if(RST) begin |
998 | | - valid_reg <= 0; |
| 978 | + valid_reg0 <= 0; |
| 979 | + valid_reg1 <= 0; |
| 980 | + valid_reg2 <= 0; |
| 981 | + valid_reg3 <= 0; |
| 982 | + valid_reg4 <= 0; |
| 983 | + valid_reg5 <= 0; |
999 | 984 | end else begin |
1000 | 985 | if(update) begin |
1001 | | - valid_reg[0] <= enable; |
1002 | | - for(i=1; i<depth; i=i+1) begin |
1003 | | - valid_reg[i] <= valid_reg[i - 1]; |
1004 | | - end |
| 986 | + valid_reg0 <= enable; |
| 987 | + valid_reg1 <= valid_reg0; |
| 988 | + valid_reg2 <= valid_reg1; |
| 989 | + valid_reg3 <= valid_reg2; |
| 990 | + valid_reg4 <= valid_reg3; |
| 991 | + valid_reg5 <= valid_reg4; |
1005 | 992 | end |
1006 | 993 | end |
1007 | 994 | end |
1008 | 995 |
|
1009 | 996 |
|
1010 | | - multiplier_core |
1011 | | - #( |
1012 | | - .datawidth(datawidth), |
1013 | | - .depth(depth) |
1014 | | - ) |
| 997 | + multiplier_core_0 |
1015 | 998 | mult |
1016 | 999 | ( |
1017 | 1000 | .CLK(CLK), |
|
1026 | 1009 |
|
1027 | 1010 |
|
1028 | 1011 |
|
1029 | | -module multiplier_core # |
1030 | | -( |
1031 | | - parameter datawidth = 32, |
1032 | | - parameter depth = 6 |
1033 | | -) |
| 1012 | +module multiplier_core_0 |
1034 | 1013 | ( |
1035 | 1014 | input CLK, |
1036 | 1015 | input update, |
1037 | | - input [datawidth-1:0] a, |
1038 | | - input [datawidth-1:0] b, |
1039 | | - output [datawidth*2-1:0] c |
| 1016 | + input [32-1:0] a, |
| 1017 | + input [32-1:0] b, |
| 1018 | + output [64-1:0] c |
1040 | 1019 | ); |
1041 | 1020 |
|
1042 | | - wire [datawidth*2-1:0] rslt; |
1043 | | - reg [datawidth*2-1:0] mem [0:depth-1]; |
1044 | | - assign rslt = a * b; |
1045 | | - assign c = mem[depth - 1]; |
1046 | | - integer i; |
| 1021 | + reg [32-1:0] _a; |
| 1022 | + reg [32-1:0] _b; |
| 1023 | + reg signed [64-1:0] _tmpval0; |
| 1024 | + reg signed [64-1:0] _tmpval1; |
| 1025 | + reg signed [64-1:0] _tmpval2; |
| 1026 | + reg signed [64-1:0] _tmpval3; |
| 1027 | + reg signed [64-1:0] _tmpval4; |
| 1028 | + wire signed [64-1:0] rslt; |
| 1029 | + assign rslt = $signed({ 1'd0, _a }) * $signed({ 1'd0, _b }); |
| 1030 | + assign c = _tmpval4; |
1047 | 1031 |
|
1048 | 1032 | always @(posedge CLK) begin |
1049 | 1033 | if(update) begin |
1050 | | - mem[0] <= rslt; |
1051 | | - for(i=1; i<depth; i=i+1) begin |
1052 | | - mem[i] <= mem[i - 1]; |
1053 | | - end |
| 1034 | + _a <= a; |
| 1035 | + _b <= b; |
| 1036 | + _tmpval0 <= rslt; |
| 1037 | + _tmpval1 <= _tmpval0; |
| 1038 | + _tmpval2 <= _tmpval1; |
| 1039 | + _tmpval3 <= _tmpval2; |
| 1040 | + _tmpval4 <= _tmpval3; |
1054 | 1041 | end |
1055 | 1042 | end |
1056 | 1043 |
|
|
0 commit comments