### 1、verilog跟System verilog区别
2、RTL跟门级建模
for 循环在 Verilog 中绝对属于“行为级建模” (Behavioral Modeling)。
从最顶层的行为级(写算法/验证脚本,只关注输入输出结果),到中间核心的RTL级(寄存器传输级,即你正在写的 assign 和 always,描述数据如何在寄存器间流动),再到最底层的门级/开关级(具体的逻辑门和晶体管,由 EDA 工具自动生成)。作为 CPU 设计者,你的工作重心死锁在 RTL 级,你负责描述“逻辑功能”,底层的“物理实现”交给工具自动完成。
3、MAC8电路设计
8位并行MAC的代码: mac8_dualmode.v
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 `timescale 1ns/1ps module mac8_dualmode #( parameter ACCW = 32 )( input wire clk, input wire rst_n, input wire clr, input wire mode, input wire [7 :0 ] a, input wire [7 :0 ] b, output reg [15 :0 ] sum_out ); wire [15 :0 ] prod = a * b; reg [15 :0 ] prev_prod; reg [15 :0 ] acc_reg; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin prev_prod <= 16'd0 ; acc_reg <= 16'd0 ; sum_out <= 16'd0 ; end else begin if (mode == 1'b0 ) begin sum_out <= prev_prod + prod; prev_prod <= prod; end else begin if (clr) begin acc_reg <= 16'd0 ; sum_out <= 16'd0 ; end else begin acc_reg <= acc_reg + prod; sum_out <= acc_reg + prod; end prev_prod <= prod; end end end endmodule
testbench:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 `timescale 1ns/1ps module mac8_dualmode_tb; reg clk; reg rst_n; reg clr; reg mode; reg [7 :0 ] a, b; wire [15 :0 ] sum_out; mac8_dualmode #( .ACCW (32 ) ) dut ( .clk (clk), .rst_n (rst_n), .clr (clr), .mode (mode), .a (a), .b (b), .sum_out (sum_out) ); initial clk = 0 ; always #10 clk = ~clk; reg [7 :0 ] a_seq [0 :19 ]; reg [7 :0 ] b_seq [0 :19 ]; integer i; initial begin a_seq[0 ]=2 ; b_seq[0 ]=3 ; a_seq[1 ]=4 ; b_seq[1 ]=5 ; a_seq[2 ]=6 ; b_seq[2 ]=7 ; a_seq[3 ]=8 ; b_seq[3 ]=1 ; a_seq[4 ]=15 ; b_seq[4 ]=15 ; a_seq[5 ]=0 ; b_seq[5 ]=0 ; a_seq[6 ]=5 ; b_seq[6 ]=3 ; a_seq[7 ]=2 ; b_seq[7 ]=4 ; a_seq[8 ]=7 ; b_seq[8 ]=7 ; a_seq[9 ]=1 ; b_seq[9 ]=2 ; a_seq[10 ]=3 ; b_seq[10 ]=3 ; a_seq[11 ]=4 ; b_seq[11 ]=3 ; a_seq[12 ]=8 ; b_seq[12 ]=8 ; a_seq[13 ]=6 ; b_seq[13 ]=2 ; a_seq[14 ]=9 ; b_seq[14 ]=1 ; a_seq[15 ]=3 ; b_seq[15 ]=5 ; a_seq[16 ]=0 ; b_seq[16 ]=0 ; a_seq[17 ]=15 ; b_seq[17 ]=1 ; a_seq[18 ]=7 ; b_seq[18 ]=5 ; a_seq[19 ]=12 ; b_seq[19 ]=12 ; end endmodule