149 lines
3.5 KiB
Coq
149 lines
3.5 KiB
Coq
|
|
/*
|
||
|
|
* Copyright (c) 2001 Stephan Boettcher <stephan@nevis.columbia.edu>
|
||
|
|
*
|
||
|
|
* 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
|
||
|
|
*/
|
||
|
|
|
||
|
|
// $Id: udp_lfsr.v,v 1.1 2001/10/27 23:38:29 sib4 Exp $
|
||
|
|
|
||
|
|
module test_lfsr;
|
||
|
|
|
||
|
|
reg cp;
|
||
|
|
reg in;
|
||
|
|
wire out;
|
||
|
|
reg reset;
|
||
|
|
lfsr sr(cp, reset, in, out);
|
||
|
|
|
||
|
|
reg errors;
|
||
|
|
initial errors = 0;
|
||
|
|
integer i;
|
||
|
|
|
||
|
|
initial
|
||
|
|
begin
|
||
|
|
in = 0;
|
||
|
|
cp = 0;
|
||
|
|
#2 reset = 1;
|
||
|
|
#2 reset = 0;
|
||
|
|
#1;
|
||
|
|
for (i=0; i<512; i=i+1)
|
||
|
|
#5 cp = ~cp;
|
||
|
|
|
||
|
|
in = 0;
|
||
|
|
cp = 0;
|
||
|
|
#2 reset = 1;
|
||
|
|
#2 reset = 0;
|
||
|
|
#1;
|
||
|
|
for (i=0; i<512; i=i+1)
|
||
|
|
#5 cp <= ~cp;
|
||
|
|
|
||
|
|
#5;
|
||
|
|
if (errors == 0)
|
||
|
|
$display("PASSED");
|
||
|
|
#10 $finish;
|
||
|
|
end
|
||
|
|
|
||
|
|
reg [7:0] here;
|
||
|
|
reg [7:0] next;
|
||
|
|
reg [7:0] old;
|
||
|
|
reg [7:0] new;
|
||
|
|
|
||
|
|
always @(reset)
|
||
|
|
if (reset)
|
||
|
|
begin
|
||
|
|
here = 1;
|
||
|
|
#1;
|
||
|
|
old = {out, sr.s};
|
||
|
|
if (old === here)
|
||
|
|
begin
|
||
|
|
$display("%b RESET", old);
|
||
|
|
end
|
||
|
|
else
|
||
|
|
begin
|
||
|
|
$display("%b RESET FAILED: expect %b", old, here);
|
||
|
|
errors = 1;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
always
|
||
|
|
begin
|
||
|
|
@(posedge cp) old = {out, sr.s};
|
||
|
|
next = {here[6:0], ^(here & sr.P) ^ in};
|
||
|
|
@(negedge cp) new = {out, sr.s};
|
||
|
|
if (old != here || new !== next)
|
||
|
|
begin
|
||
|
|
$display("%b->%b FAILED: expect %b->%b", old, new, here, next);
|
||
|
|
errors = 1;
|
||
|
|
end
|
||
|
|
else
|
||
|
|
begin
|
||
|
|
$display("%b->%b", old, new);
|
||
|
|
end
|
||
|
|
here = next;
|
||
|
|
end
|
||
|
|
|
||
|
|
endmodule
|
||
|
|
|
||
|
|
module lfsr (clk, reset, in, out);
|
||
|
|
|
||
|
|
parameter P = 8'b 1101_1001;
|
||
|
|
|
||
|
|
input clk;
|
||
|
|
input reset;
|
||
|
|
input in;
|
||
|
|
|
||
|
|
output out;
|
||
|
|
wire [6:0] s;
|
||
|
|
wire i = ^{P & {out,s}} ^ in;
|
||
|
|
|
||
|
|
jkff ff1 (s[0], clk, i, ~i, reset, 0);
|
||
|
|
jkff ff2 (s[1], clk, s[0], ~s[0], 0, reset);
|
||
|
|
jkff ff3 (s[2], clk, s[1], ~s[1], 0, reset);
|
||
|
|
jkff ff4 (s[3], clk, s[2], ~s[2], 0, reset);
|
||
|
|
|
||
|
|
jkff ff8 (out, clk, s[6], ~s[6], 0, reset);
|
||
|
|
jkff ff7 (s[6], clk, s[5], ~s[5], 0, reset);
|
||
|
|
jkff ff6 (s[5], clk, s[4], ~s[4], 0, reset);
|
||
|
|
jkff ff5 (s[4], clk, s[3], ~s[3], 0, reset);
|
||
|
|
|
||
|
|
endmodule
|
||
|
|
|
||
|
|
primitive jkff(q, cp, j, k, s, r);
|
||
|
|
output q;
|
||
|
|
input cp, j, k, s, r;
|
||
|
|
reg q;
|
||
|
|
table
|
||
|
|
// (cp) j k s r : q : q ;
|
||
|
|
? ? ? (?0) 0 : ? : - ;
|
||
|
|
? ? ? 0 (?0) : ? : - ;
|
||
|
|
? * ? 0 0 : ? : - ;
|
||
|
|
? ? * 0 0 : ? : - ;
|
||
|
|
? ? ? 1 0 : ? : 1 ;
|
||
|
|
? ? ? 0 1 : ? : 0 ;
|
||
|
|
? ? ? x 0 : 1 : 1 ;
|
||
|
|
? ? ? 0 x : 0 : 0 ;
|
||
|
|
(?0) ? ? 0 0 : ? : - ;
|
||
|
|
(1x) ? ? 0 0 : ? : - ;
|
||
|
|
(?1) 0 ? 0 0 : 0 : 0 ;
|
||
|
|
(?1) ? 0 0 0 : 1 : 1 ;
|
||
|
|
(0x) 0 ? 0 0 : 0 : 0 ;
|
||
|
|
(0x) ? 0 0 0 : 1 : 1 ;
|
||
|
|
(01) 1 ? 0 0 : 0 : 1 ;
|
||
|
|
(01) ? 1 0 0 : 1 : 0 ;
|
||
|
|
(01) 1 0 0 0 : x : 1 ;
|
||
|
|
(01) 0 1 0 0 : x : 0 ;
|
||
|
|
endtable
|
||
|
|
endprimitive
|