iverilog/ivtest/ivltests/modparam.v

160 lines
3.4 KiB
Verilog

//
// Copyright (c) 1999 Steven Wilson (stevew@home.com)
//
// This source code is free software; you can redistribute it
// and/or modify it in source code form under the terms of the GNU
// General Public License as published by the Free Software
// Foundation; either version 2 of the License, or (at your option)
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
//
// SDW - Validate parameter passing override in module declaration.
//
// Build a single line of storage - Note it's
//
module reg32 (clk,we, din, dout);
parameter WIDTH=32;
input we;
input clk;
input [WIDTH-1:0] din;
output [WIDTH-1:0] dout;
reg [WIDTH-1:0] store;
always @(posedge clk)
if(we)
store <= din;
assign dout = store ;
endmodule
module memory(clk, we, addr, din, dout);
parameter WIDTH=8;
input clk;
input we;
input [1:0] addr;
input [WIDTH-1:0] din;
output [WIDTH-1:0] dout;
reg [WIDTH-1:0] dout;
wire [WIDTH-1:0] dout0,dout1,dout2,dout3;
reg we0,we1,we2,we3;
reg32 #(WIDTH) reg0 (.clk(clk),.we(we0),.din(din[WIDTH-1:0]),
.dout(dout0[WIDTH-1:0]));
reg32 #(WIDTH) reg1 (.clk(clk),.we(we1),.din(din[WIDTH-1:0]),
.dout(dout1[WIDTH-1:0]));
reg32 #(WIDTH) reg2 (.clk(clk),.we(we2),.din(din[WIDTH-1:0]),
.dout(dout2[WIDTH-1:0]));
reg32 #(WIDTH) reg3 (.clk(clk),.we(we3),.din(din[WIDTH-1:0]),
.dout(dout3[WIDTH-1:0]));
//
// Build we decode
//
always @(addr or we)
case (addr)
2'b00: begin
we0 = we;
we1 = 0;
we2 = 0;
we3 = 0;
end
2'b01: begin
we0 = 0;
we1 = we;
we2 = 0;
we3 = 0;
end
2'b10: begin
we0 = 0;
we1 = 0;
we2 = we;
we3 = 0;
end
2'b11: begin
we0 = 0;
we1 = 0;
we2 = 0;
we3 = we;
end
endcase
//
// Connect dout to register output
//
always @(addr or dout0 or dout1 or dout2 or dout3)
case (addr)
2'b00: dout = dout0;
2'b01: dout = dout1;
2'b10: dout = dout2;
2'b11: dout = dout3;
endcase
endmodule
module top;
parameter WIDTH=8;
reg clk;
reg we;
reg [1:0] addr;
reg [WIDTH-1:0] din;
reg error;
wire [WIDTH-1:0] dout;
memory mem (clk, we, addr, din, dout);
initial
begin
// $dumpfile("test.vcd");
// $dumpvars(0,top.mem.reg0);
clk = 0;
error =0;
#3;
we = 1;
addr = 0;
din = 32'b0_00;
#10;
addr = 1;
din = 32'h1;
#10;
addr = 2;
din = 32'h2;
#10;
addr = 3;
din = 32'h3;
#10;
we = 0;
addr = 0;
#1;
if(dout[7:0] !== 8'h00)
begin
$display("FAILED - Ram[0] not 0, is %h",dout[7:0]);
error = 1;
end
if(error == 0)
$display("PASSED");
$finish ;
end
always #(5) clk = ~clk;
endmodule