加法树乘法器的system verilog的实现,由于逻辑功能简单明了,只用了简单的断言验证,
如果有疑问请给我留言
Code
1 `timescale 1ns/10ps
2 module mult(clk,a,b,result);
3 parameter cmp_sva=1'b1;//assertion enable
4 input clk;
5 input [7:0] a;
6 input [7:0] b;
7 output [15:0] result;
8
9 wire[10:0] result_low;
10 wire[14:0] result_high;
11
12 logic [7:0] result0;
13 logic [8:0] result1;
14 logic [9:0] result2;
15 logic [10:0] result3;
16 logic [11:0] result4;
17 logic [12:0] result5;
18 logic [13:0] result6;
19 logic [14:0] result7;
20 logic [8:0] out0;
21 logic [10:0] out1;
22 logic [12:0] out2;
23 logic [14:0] out3;
24 logic [15:0] result_sva;//asserction result
25
26 function[7:0] mux;
27 input [7:0] operand;
28 input select;
29 begin
30 mux=select?operand:8'b00000000;
31 end
32 endfunction
33 always@(a or b)
34 begin
35 result0<=mux(a,b[0]);
36 result1<=mux(a,b[1])<<1;
37 result2<=mux(a,b[2])<<2;
38 result3<=mux(a,b[3])<<3;
39 result4<=mux(a,b[4])<<4;
40 result5<=mux(a,b[5])<<5;
41 result6<=mux(a,b[6])<<6;
42 result7<=mux(a,b[7])<<7;
43 end
44
45 always@*
46 begin
47 out0<=result0+result1;
48 out1<=result2+result3;
49 out2<=result4+result5;
50 out3<=result6+result7;
51 end
52
53 assign result_low=out0+out1;
54 assign result_high=out2+out3;
55 assign result=result_low+result_high;
56
57
58 //sva check
59 always@(a or b)
60 if(cmp_sva)
61 begin
62 result_sva=a*b;
63 #1 a_cmp:assert(result_sva==result)
64 else
65 $display("result error at %d",$time);
66 end
67 endmodule
68
69 `timescale 1ns/10ps
70 module mult_testbench;
71 reg clk;
72 reg [7:0] a;
73 reg [7:0] b;
74 wire[15:0] result;
75 mult #(1)
76 mult_inst(.clk(clk),
77 .a(a),
78 .b(b),
79 .result(result)
80 );
81 initial
82 begin
83 clk=0;
84 #10;
85 a=8;
86 b=9;
87 #10;
88 a=16;
89 b=16;
90 #200 $finish;
91 end
92 initial
93 begin
94 $monitor("%d*%d=%d at %d",a,b,result,$time);
95 end
96 always #5 clk=~clk;
97 endmodule
完整代码:
mult_sv.rar