网上找的,不过编译有重定义问题,还有时序是无限的,用一些仿真工具会出现无法load dump问题,改了改,用作以后参考
// Code your testbench here
// or browse Examples
module find_gcd
(
input [7 : 0] data_a,
input [7 : 0] data_b,
input clk,
input rst_n,
output reg gcd_valid,
output reg [7 : 0] gcd,
//------------<temporary output>-----------------
output reg [2 : 0] current_state,
output reg [7 : 0] buffer_a,
output reg [7 : 0] buffer_b
);
localparam IDLE = 3'b000,
COMP = 3'b001,
CALC1 = 3'b010,
CALC2 = 3'b011,
RESU = 3'b100;
reg [7 : 0] r, t;
//buffer_a, buffer_b;
reg [2 : 0] next_state;//current_state,
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
current_state <= IDLE;
else
current_state <= next_state;
end
always@(*)
begin
case(current_state)
IDLE: begin
gcd_valid = 0;
gcd = 0;
buffer_a = data_a;
buffer_b = data_b;
next_state = COMP;
end
COMP: begin
if (buffer_a < buffer_b) begin
r = buffer_a;
buffer_a = buffer_b;
buffer_b = r;
end
next_state = CALC1;
end
CALC1: begin
t = buffer_a % buffer_b;
buffer_a = buffer_b;
buffer_b = t;
if(buffer_b)
next_state = CALC2;
else
next_state = RESU;
end
CALC2: begin
t = buffer_a % buffer_b;
buffer_a = buffer_b;
buffer_b = t;
if(buffer_b)
next_state = CALC1;
else
next_state = RESU;
end
RESU: begin
gcd = buffer_a;
gcd_valid = 1;
next_state = IDLE;
end
default: gcd = 0;
endcase
end
endmodule
`timescale 1ns / 1ps
module tb_gcd;
reg clk, rst_n;
reg [7 : 0] data_a, data_b;
wire [7 : 0] gcd;
wire valid;
wire [2 : 0] current_state;
wire [7 : 0] buffer_a, buffer_b;
find_gcd f1
(
.clk(clk),
.rst_n(rst_n),
.data_a(data_a),
.data_b(data_b),
.gcd(gcd),
.gcd_valid(valid),
.current_state(current_state),
.buffer_a(buffer_a),
.buffer_b(buffer_b)
);
int count =0;
initial begin
$dumpfile("dump.vcd");
clk = 0;
rst_n = 0;
@(negedge clk) rst_n = 1;
data_a = 8'd15;
data_b = 8'd24;
@(negedge valid)
data_a = 8'd9;
data_b = 8'd7;
@(negedge valid)
data_a = 8'd27;
data_b = 8'd81;
end
always begin
#1 clk = ~clk;
$dumpvars;
count++;
if (count>100)
$finish;
end
endmodule