mirror of
https://github.com/sehugg/8bitworkshop.git
synced 2026-04-21 06:16:43 +00:00
verilog: scope updates, show js code, simple cpu
This commit is contained in:
@@ -55,6 +55,17 @@ describe('Verilog Worker', function() {
|
||||
testVerilator('presets/verilog/lfsr.v');
|
||||
// TODO: how to include files?
|
||||
|
||||
//testVerilator('test/cli/verilog/t_tri_gate.v');
|
||||
testVerilator('test/cli/verilog/t_tri_gen.v', ['UNDRIVEN']);
|
||||
testVerilator('test/cli/verilog/t_tri_graph.v', ['UNDRIVEN']);
|
||||
testVerilator('test/cli/verilog/t_tri_ifbegin.v', ['UNDRIVEN']);
|
||||
testVerilator('test/cli/verilog/t_tri_inout.v');
|
||||
testVerilator('test/cli/verilog/t_tri_inout2.v');
|
||||
testVerilator('test/cli/verilog/t_tri_pullup.v', ['UNDRIVEN']);
|
||||
testVerilator('test/cli/verilog/t_tri_select_unsized.v', ['WIDTH']);
|
||||
testVerilator('test/cli/verilog/t_tri_unconn.v', ['PINCONNECTEMPTY']);
|
||||
testVerilator('test/cli/verilog/t_tri_various.v', ['UNDRIVEN']);
|
||||
|
||||
/* TODO: fix tests
|
||||
testVerilator('test/cli/verilog/t_order_doubleloop.v', ['BLKSEQ']);
|
||||
testVerilator('test/cli/verilog/t_alw_combdly.v');
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
// DESCRIPTION: Verilator: Verilog Test module
|
||||
//
|
||||
// This file ONLY is placed into the Public Domain, for any use,
|
||||
// without warranty, 2012 by Wilson Snyder.
|
||||
|
||||
module t (/*AUTOARG*/
|
||||
// Inputs
|
||||
clk
|
||||
);
|
||||
input clk;
|
||||
|
||||
tri z0;
|
||||
tri z1;
|
||||
|
||||
updown #(0) updown0 (.z(z0));
|
||||
updown #(1) updown1 (.z(z1));
|
||||
|
||||
always @ (posedge clk) begin
|
||||
if (z0 !== 0) $stop;
|
||||
if (z1 !== 1) $stop;
|
||||
$write("*-* All Finished *-*\n");
|
||||
$finish;
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
module updown #(parameter UP=0)
|
||||
(inout z);
|
||||
generate
|
||||
if (UP) begin
|
||||
t_up sub (.z);
|
||||
end
|
||||
else begin
|
||||
t_down sub (.z);
|
||||
end
|
||||
endgenerate
|
||||
endmodule
|
||||
|
||||
module t_up (inout tri1 z);
|
||||
endmodule
|
||||
|
||||
module t_down (inout tri0 z);
|
||||
endmodule
|
||||
@@ -0,0 +1,27 @@
|
||||
// DESCRIPTION: Verilator: Unsupported tristate constructur error
|
||||
//
|
||||
// This is a compile only regression test of tristate handling for bug514
|
||||
//
|
||||
// This file ONLY is placed into the Public Domain, for any use,
|
||||
// without warranty, 2012 by Jeremy Bennett.
|
||||
|
||||
module t (/*AUTOARG*/
|
||||
// Inputs
|
||||
clk
|
||||
);
|
||||
input clk;
|
||||
|
||||
wire [11:0] ck;
|
||||
|
||||
assign ck[1:0] = {1'bz,{1{1'b0}}};
|
||||
|
||||
test i_test (.clk (ck[1:0]));
|
||||
|
||||
endmodule
|
||||
|
||||
|
||||
module test (clk);
|
||||
|
||||
output wire [1:0] clk;
|
||||
|
||||
endmodule // test
|
||||
@@ -0,0 +1,52 @@
|
||||
// DESCRIPTION: Verilator: Verilog Test module
|
||||
|
||||
module top (/*AUTOARG*/
|
||||
// Inputs
|
||||
clk
|
||||
);
|
||||
input clk;
|
||||
|
||||
tri pad_io_h;
|
||||
tri pad_io_l;
|
||||
|
||||
sub sub (.*);
|
||||
|
||||
endmodule
|
||||
|
||||
|
||||
module sub (/*AUTOARG*/
|
||||
// Inouts
|
||||
pad_io_h, pad_io_l
|
||||
);
|
||||
|
||||
parameter USE = 1'b1;
|
||||
parameter DIFFERENTIAL = 1'b1;
|
||||
parameter BIDIR = 1'b1;
|
||||
|
||||
inout pad_io_h;
|
||||
inout pad_io_l;
|
||||
|
||||
wire [31:0] dqs_out_dtap_delay;
|
||||
|
||||
generate
|
||||
if (USE) begin: output_strobe
|
||||
wire aligned_os_oe;
|
||||
wire aligned_strobe;
|
||||
|
||||
if (BIDIR) begin
|
||||
reg sig_h_r = 1'b0;
|
||||
reg sig_l_r = 1'b0;
|
||||
always @* begin
|
||||
sig_h_r = ~aligned_os_oe ? aligned_strobe : 1'bz;
|
||||
if (DIFFERENTIAL)
|
||||
sig_l_r = ~aligned_os_oe ? ~aligned_strobe : 1'bz;
|
||||
end
|
||||
assign pad_io_h = sig_h_r;
|
||||
if (DIFFERENTIAL)
|
||||
assign pad_io_l = sig_l_r;
|
||||
end
|
||||
end
|
||||
endgenerate
|
||||
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
// This file ONLY is placed into the Public Domain, for any use,
|
||||
// without warranty, 2008 by Lane Brooks
|
||||
|
||||
module top (input A, input B, input SEL, output Y1, output Y2, output Z);
|
||||
io io1(.A(A), .OE( SEL), .Z(Z), .Y(Y1));
|
||||
pass io2(.A(B), .OE(!SEL), .Z(Z), .Y(Y2));
|
||||
assign Z = 1'bz;
|
||||
endmodule
|
||||
|
||||
module pass (input A, input OE, inout Z, output Y);
|
||||
io io(.A(A), .OE(OE), .Z(Z), .Y(Y));
|
||||
assign Z = 1'bz;
|
||||
endmodule
|
||||
|
||||
module io (input A, input OE, inout Z, output Y);
|
||||
assign Z = (OE) ? A : 1'bz;
|
||||
assign Y = Z;
|
||||
assign Z = 1'bz;
|
||||
endmodule
|
||||
@@ -0,0 +1,77 @@
|
||||
// DESCRIPTION: Verilator: Verilog Test module
|
||||
//
|
||||
// This file ONLY is placed into the Public Domain, for any use,
|
||||
// without warranty, 2008 by Wilson Snyder.
|
||||
|
||||
module t (/*AUTOARG*/
|
||||
// Inputs
|
||||
clk
|
||||
);
|
||||
input clk;
|
||||
|
||||
reg [2:0] in;
|
||||
|
||||
|
||||
wire a,y,y_fixed;
|
||||
wire b = in[0];
|
||||
wire en = in[1];
|
||||
|
||||
|
||||
pullup(a);
|
||||
|
||||
ChildA childa ( .A(a), .B(b), .en(en), .Y(y),.Yfix(y_fixed) );
|
||||
|
||||
initial in=0;
|
||||
initial en=0;
|
||||
|
||||
// Test loop
|
||||
always @ (posedge clk) begin
|
||||
|
||||
|
||||
in <= in + 1;
|
||||
|
||||
$display ( "a %d b %d en %d y %d yfix: %d)" , a, b, en, y, y_fixed);
|
||||
if (en) begin
|
||||
// driving b
|
||||
// a should be b
|
||||
// y and yfix should also be b
|
||||
if (a!=b || y != b || y_fixed != b) begin
|
||||
$display ( "Expected a %d y %b yfix %b" , a, y, y_fixed);
|
||||
$stop;
|
||||
end
|
||||
|
||||
end else begin
|
||||
// not driving b
|
||||
// a should be 1 (pullup)
|
||||
// y and yfix shold be 1
|
||||
if (a!=1 || y != 1 || y_fixed != 1) begin
|
||||
$display( "Expected a,y,yfix == 1");
|
||||
$stop;
|
||||
end
|
||||
end
|
||||
|
||||
if (in==3) begin
|
||||
$write("*-* All Finished *-*\n");
|
||||
$finish;
|
||||
end
|
||||
end
|
||||
endmodule
|
||||
|
||||
module ChildA(inout A, input B, input en, output Y, output Yfix);
|
||||
|
||||
// workaround
|
||||
wire a_in = A;
|
||||
|
||||
ChildB childB(.A(A), .Y(Y));
|
||||
assign A = en ? B : 1'bz;
|
||||
|
||||
|
||||
ChildB childBfix(.A(a_in),.Y(Yfix));
|
||||
|
||||
|
||||
endmodule
|
||||
|
||||
module ChildB(input A, output Y);
|
||||
assign Y = A;
|
||||
endmodule
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
// This file ONLY is placed into the Public Domain, for any use,
|
||||
// without warranty, 2008 by Lane Brooks
|
||||
|
||||
module top (input A, input OE, output X, output Y, output Z);
|
||||
|
||||
pullup p1(Z);
|
||||
assign Z = OE ? A : 1'bz;
|
||||
|
||||
pulldown p2(Y);
|
||||
assign Y = OE ? A : 1'bz;
|
||||
|
||||
pass pass(.A(A), .OE(OE), .X(X));
|
||||
pullup_module p(X);
|
||||
endmodule
|
||||
|
||||
module pass (input A, input OE, inout X);
|
||||
io io(.A(A), .OE(OE), .X(X));
|
||||
endmodule
|
||||
|
||||
module io (input A, input OE, inout X);
|
||||
assign X = (OE) ? A : 1'bz;
|
||||
endmodule
|
||||
|
||||
module pullup_module (output X);
|
||||
pullup p1(X);
|
||||
endmodule
|
||||
@@ -0,0 +1,27 @@
|
||||
// DESCRIPTION: Verilator: Test of selection with unsized Z.
|
||||
//
|
||||
// Test selecting Z when size is not explicit. Issue 510.
|
||||
//
|
||||
// This file ONLY is placed into the Public Domain, for any use,
|
||||
// without warranty, 2012 by Jeremy Bennett.
|
||||
|
||||
module t (/*AUTOARG*/
|
||||
// Inputs
|
||||
clk
|
||||
);
|
||||
input clk;
|
||||
|
||||
wire [1:0] b;
|
||||
wire [1:0] c;
|
||||
wire [0:0] d; // Explicit width due to issue 508
|
||||
wire [0:0] e;
|
||||
|
||||
// This works if we use 1'bz, or 1'bx, but not with just 'bz or 'bx. It
|
||||
// does require the tri-state Z. Since we get the same effect if b is
|
||||
// dimensioned [0:0], this may be connected to issue 508.
|
||||
assign b[1:0] = clk ? 2'bx : 'bz;
|
||||
assign c[1:0] = clk ? 2'bz : 'bx;
|
||||
assign d = clk ? 1'bx : 'bz;
|
||||
assign e = clk ? 1'bz : 'bx;
|
||||
|
||||
endmodule // t
|
||||
@@ -0,0 +1,124 @@
|
||||
// DESCRIPTION: Verilator: Verilog Test module
|
||||
//
|
||||
// This file ONLY is placed into the Public Domain, for any use,
|
||||
// without warranty, 2012 by Wilson Snyder.
|
||||
|
||||
module t (/*AUTOARG*/
|
||||
// Inputs
|
||||
clk
|
||||
);
|
||||
input clk;
|
||||
|
||||
integer cyc=0;
|
||||
|
||||
wire one = '1;
|
||||
wire z0 = 'z;
|
||||
wire z1 = 'z;
|
||||
wire z2 = 'z;
|
||||
wire z3 = 'z;
|
||||
wire tog = cyc[0];
|
||||
|
||||
// verilator lint_off PINMISSING
|
||||
t_tri0 tri0a (.line(`__LINE__), .expval(1'b0)); // Pin missing
|
||||
t_tri0 tri0b (.line(`__LINE__), .expval(1'b0), .tn());
|
||||
t_tri0 tri0z (.line(`__LINE__), .expval(1'b0), .tn(z0));
|
||||
t_tri0 tri0Z (.line(`__LINE__), .expval(1'b0), .tn(1'bz));
|
||||
t_tri0 tri0c (.line(`__LINE__), .expval(1'b0), .tn(1'b0));
|
||||
t_tri0 tri0d (.line(`__LINE__), .expval(1'b1), .tn(1'b1)); // Warning would be reasonable given tri0 connect
|
||||
t_tri0 tri0e (.line(`__LINE__), .expval(1'b0), .tn(~one));
|
||||
t_tri0 tri0f (.line(`__LINE__), .expval(1'b1), .tn(one));
|
||||
t_tri0 tri0g (.line(`__LINE__), .expval(~cyc[0]), .tn(~tog));
|
||||
t_tri0 tri0h (.line(`__LINE__), .expval(cyc[0]), .tn(tog));
|
||||
|
||||
t_tri1 tri1a (.line(`__LINE__), .expval(1'b1)); // Pin missing
|
||||
t_tri1 tri1b (.line(`__LINE__), .expval(1'b1), .tn());
|
||||
t_tri1 tri1z (.line(`__LINE__), .expval(1'b1), .tn(z1));
|
||||
t_tri1 tri1Z (.line(`__LINE__), .expval(1'b1), .tn(1'bz));
|
||||
t_tri1 tri1c (.line(`__LINE__), .expval(1'b0), .tn(1'b0)); // Warning would be reasonable given tri1 connect
|
||||
t_tri1 tri1d (.line(`__LINE__), .expval(1'b1), .tn(1'b1));
|
||||
t_tri1 tri1e (.line(`__LINE__), .expval(1'b0), .tn(~one));
|
||||
t_tri1 tri1f (.line(`__LINE__), .expval(1'b1), .tn(one));
|
||||
t_tri1 tri1g (.line(`__LINE__), .expval(~cyc[0]), .tn(~tog));
|
||||
t_tri1 tri1h (.line(`__LINE__), .expval(cyc[0]), .tn(tog));
|
||||
|
||||
t_tri2 tri2a (.line(`__LINE__), .expval(1'b0)); // Pin missing
|
||||
t_tri2 tri2b (.line(`__LINE__), .expval(1'b0), .tn());
|
||||
t_tri2 tri2z (.line(`__LINE__), .expval(1'b0), .tn(z2));
|
||||
t_tri2 tri2Z (.line(`__LINE__), .expval(1'b0), .tn(1'bz));
|
||||
t_tri2 tri2c (.line(`__LINE__), .expval(1'b0), .tn(1'b0));
|
||||
t_tri2 tri2d (.line(`__LINE__), .expval(1'b1), .tn(1'b1));
|
||||
t_tri2 tri2e (.line(`__LINE__), .expval(1'b0), .tn(~one));
|
||||
t_tri2 tri2f (.line(`__LINE__), .expval(1'b1), .tn(one));
|
||||
t_tri2 tri2g (.line(`__LINE__), .expval(~cyc[0]), .tn(~tog));
|
||||
t_tri2 tri2h (.line(`__LINE__), .expval(cyc[0]), .tn(tog));
|
||||
|
||||
t_tri3 tri3a (.line(`__LINE__), .expval(1'b1)); // Pin missing
|
||||
t_tri3 tri3b (.line(`__LINE__), .expval(1'b1), .tn());
|
||||
t_tri3 tri3z (.line(`__LINE__), .expval(1'b1), .tn(z3));
|
||||
t_tri3 tri3Z (.line(`__LINE__), .expval(1'b1), .tn(1'bz));
|
||||
t_tri3 tri3c (.line(`__LINE__), .expval(1'b0), .tn(1'b0));
|
||||
t_tri3 tri3d (.line(`__LINE__), .expval(1'b1), .tn(1'b1));
|
||||
t_tri3 tri3e (.line(`__LINE__), .expval(1'b0), .tn(~one));
|
||||
t_tri3 tri3f (.line(`__LINE__), .expval(1'b1), .tn(one));
|
||||
t_tri3 tri3g (.line(`__LINE__), .expval(~cyc[0]), .tn(~tog));
|
||||
t_tri3 tri3h (.line(`__LINE__), .expval(cyc[0]), .tn(tog));
|
||||
// verilator lint_on PINMISSING
|
||||
|
||||
// Test loop
|
||||
always @ (posedge clk) begin
|
||||
cyc <= cyc + 1;
|
||||
if (cyc==99) begin
|
||||
$write("*-* All Finished *-*\n");
|
||||
$finish;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
module t_tri0
|
||||
(line, expval, tn);
|
||||
input integer line;
|
||||
input expval;
|
||||
input tn; // Illegal to be inout; spec requires net connection to any inout
|
||||
tri0 tn;
|
||||
wire clk = t.clk;
|
||||
always @(posedge clk) if (tn !== expval) begin
|
||||
$display("%%Error: from line %0d got=%x exp=%x",line,tn,expval); $stop;
|
||||
end
|
||||
endmodule
|
||||
|
||||
module t_tri1
|
||||
(line, expval, tn);
|
||||
input integer line;
|
||||
input expval;
|
||||
input tn;
|
||||
tri1 tn;
|
||||
wire clk = t.clk;
|
||||
always @(posedge clk) if (tn !== expval) begin
|
||||
$display("%%Error: from line %0d got=%x exp=%x",line,tn,expval); $stop;
|
||||
end
|
||||
endmodule
|
||||
|
||||
module t_tri2
|
||||
(line, expval, tn);
|
||||
input integer line;
|
||||
input expval;
|
||||
input tn;
|
||||
pulldown(tn);
|
||||
wire clk = t.clk;
|
||||
always @(posedge clk) if (tn !== expval) begin
|
||||
$display("%%Error: from line %0d got=%x exp=%x",line,tn,expval); $stop;
|
||||
end
|
||||
endmodule
|
||||
|
||||
module t_tri3
|
||||
(line, expval, tn);
|
||||
input integer line;
|
||||
input expval;
|
||||
input tn;
|
||||
pullup(tn);
|
||||
wire clk = t.clk;
|
||||
always @(negedge clk) if (tn !== expval) begin
|
||||
$display("%%Error: from line %0d got=%x exp=%x",line,tn,expval); $stop;
|
||||
end
|
||||
endmodule
|
||||
@@ -0,0 +1,211 @@
|
||||
// This file ONLY is placed into the Public Domain, for any use,
|
||||
// without warranty, 2008 by Lane Brooks
|
||||
|
||||
module t (clk);
|
||||
input clk;
|
||||
|
||||
reg [31:0] state; initial state=0;
|
||||
|
||||
wire A = state[0];
|
||||
wire OE = state[1];
|
||||
wire Z1, Z2, Z3, Z4, Z5, Z6, Z7, Z8, Z9;
|
||||
wire [3:0] Z10;
|
||||
wire Z11;
|
||||
|
||||
Test1 test1(/*AUTOINST*/
|
||||
// Inouts
|
||||
.Z1 (Z1),
|
||||
// Inputs
|
||||
.OE (OE),
|
||||
.A (A));
|
||||
|
||||
Test2 test2(/*AUTOINST*/
|
||||
// Inouts
|
||||
.Z2 (Z2),
|
||||
// Inputs
|
||||
.OE (OE),
|
||||
.A (A));
|
||||
|
||||
Test3 test3(/*AUTOINST*/
|
||||
// Inouts
|
||||
.Z3 (Z3),
|
||||
// Inputs
|
||||
.OE (OE),
|
||||
.A (A));
|
||||
|
||||
Test4 test4(/*AUTOINST*/
|
||||
// Outputs
|
||||
.Z4 (Z4),
|
||||
// Inouts
|
||||
.Z5 (Z5));
|
||||
|
||||
Test5 test5(/*AUTOINST*/
|
||||
// Inouts
|
||||
.Z6 (Z6),
|
||||
.Z7 (Z7),
|
||||
.Z8 (Z8),
|
||||
.Z9 (Z9),
|
||||
// Inputs
|
||||
.OE (OE));
|
||||
|
||||
Test6 test6(/*AUTOINST*/
|
||||
// Inouts
|
||||
.Z10 (Z10[3:0]),
|
||||
// Inputs
|
||||
.OE (OE));
|
||||
|
||||
Test7 test7(/*AUTOINST*/
|
||||
// Outputs
|
||||
.Z11 (Z11),
|
||||
// Inputs
|
||||
.state (state[2:0]));
|
||||
|
||||
always @(posedge clk) begin
|
||||
state <= state + 1;
|
||||
`ifdef TEST_VERBOSE
|
||||
$write("[%0t] state=%d Z1=%b 2=%b 3=%b 4=%b 5=%b 6=%b 7=%b 8=%b 9=%b 10=%b 11=%b\n",
|
||||
$time, state, Z1,Z2,Z3,Z4,Z5,Z6,Z7,Z8,Z9,Z10,Z11);
|
||||
`endif
|
||||
|
||||
if(state == 0) begin
|
||||
if(Z1 !== 1'b1) $stop; // tests pullups
|
||||
if(Z2 !== 1'b1) $stop;
|
||||
if(Z3 !== 1'b1) $stop;
|
||||
`ifndef VERILATOR
|
||||
if(Z4 !== 1'b1) $stop;
|
||||
`endif
|
||||
if(Z5 !== 1'b1) $stop;
|
||||
if(Z6 !== 1'b1) $stop;
|
||||
if(Z7 !== 1'b0) $stop;
|
||||
if(Z8 !== 1'b0) $stop;
|
||||
if(Z9 !== 1'b1) $stop;
|
||||
if(Z10 !== 4'b0001) $stop;
|
||||
if(Z11 !== 1'b0) $stop;
|
||||
end
|
||||
else if(state == 1) begin
|
||||
if(Z1 !== 1'b1) $stop; // tests pullup
|
||||
if(Z2 !== 1'b1) $stop;
|
||||
if(Z3 !== 1'b1) $stop;
|
||||
`ifndef VERILATOR
|
||||
if(Z4 !== 1'b1) $stop;
|
||||
`endif
|
||||
if(Z5 !== 1'b1) $stop;
|
||||
if(Z6 !== 1'b1) $stop;
|
||||
if(Z7 !== 1'b0) $stop;
|
||||
if(Z8 !== 1'b0) $stop;
|
||||
if(Z9 !== 1'b1) $stop;
|
||||
if(Z10 !== 4'b0001) $stop;
|
||||
if(Z11 !== 1'b1) $stop;
|
||||
end
|
||||
else if(state == 2) begin
|
||||
if(Z1 !== 1'b0) $stop; // tests output driver low
|
||||
if(Z2 !== 1'b0) $stop;
|
||||
if(Z3 !== 1'b1 && Z3 !== 1'bx) $stop; // Conflicts
|
||||
`ifndef VERILATOR
|
||||
if(Z4 !== 1'b1) $stop;
|
||||
`endif
|
||||
if(Z5 !== 1'b1) $stop;
|
||||
if(Z6 !== 1'b0) $stop;
|
||||
if(Z7 !== 1'b1) $stop;
|
||||
if(Z8 !== 1'b1) $stop;
|
||||
if(Z9 !== 1'b0) $stop;
|
||||
if(Z10 !== 4'b0010) $stop;
|
||||
//if(Z11 !== 1'bx) $stop; // Doesn't matter
|
||||
end
|
||||
else if(state == 3) begin
|
||||
if(Z1 !== 1'b1) $stop; // tests output driver high
|
||||
if(Z2 !== 1'b1) $stop;
|
||||
if(Z3 !== 1'b1) $stop;
|
||||
`ifndef VERILATOR
|
||||
if(Z4 !== 1'b1) $stop;
|
||||
`endif
|
||||
if(Z5 !== 1'b1) $stop;
|
||||
if(Z6 !== 1'b0) $stop;
|
||||
if(Z7 !== 1'b1) $stop;
|
||||
if(Z8 !== 1'b1) $stop;
|
||||
if(Z9 !== 1'b0) $stop;
|
||||
if(Z10 !== 4'b0010) $stop;
|
||||
if(Z11 !== 1'b1) $stop;
|
||||
end
|
||||
else if(state == 4) begin
|
||||
$write("*-* All Finished *-*\n");
|
||||
$finish;
|
||||
end
|
||||
end
|
||||
pullup(Z1);
|
||||
pullup(Z2);
|
||||
pullup(Z3);
|
||||
pullup(Z4);
|
||||
pullup(Z5);
|
||||
pullup(Z6);
|
||||
pulldown(Z7);
|
||||
pullup(Z8);
|
||||
pulldown(Z9);
|
||||
pulldown pd10[3:0] (Z10);
|
||||
endmodule
|
||||
|
||||
|
||||
module Test1(input OE, input A, inout Z1);
|
||||
assign Z1 = (OE) ? A : 1'bz;
|
||||
endmodule
|
||||
|
||||
module Test2(input OE, input A, inout Z2);
|
||||
assign Z2 = (OE) ? A : 1'bz;
|
||||
endmodule
|
||||
|
||||
|
||||
// mixed low-Z and tristate
|
||||
module Test3(input OE, input A, inout Z3);
|
||||
assign Z3 = (OE) ? A : 1'bz;
|
||||
assign Z3 = 1'b1;
|
||||
endmodule
|
||||
|
||||
|
||||
// floating output and inout
|
||||
`ifndef VERILATOR
|
||||
// Note verilator doesn't know to make Z4 a tristate unless marked an inout
|
||||
`endif
|
||||
module Test4(output Z4, inout Z5);
|
||||
endmodule
|
||||
|
||||
|
||||
// AND gate tristates
|
||||
module Test5(input OE, inout Z6, inout Z7, inout Z8, inout Z9);
|
||||
assign Z6 = (OE) ? 1'b0 : 1'bz;
|
||||
assign Z7 = (OE) ? 1'b1 : 1'bz;
|
||||
assign Z8 = (OE) ? 1'bz : 1'b0;
|
||||
assign Z9 = (OE) ? 1'bz : 1'b1;
|
||||
endmodule
|
||||
|
||||
// AND gate tristates
|
||||
module Test6(input OE, inout [3:0] Z10);
|
||||
wire [1:0] i;
|
||||
Test6a a (.OE(OE), .Z({Z10[0],Z10[1]}));
|
||||
Test6a b (.OE(~OE), .Z({Z10[2],Z10[0]}));
|
||||
endmodule
|
||||
|
||||
module Test6a(input OE, inout [1:0] Z);
|
||||
assign Z = (OE) ? 2'b01 : 2'bzz;
|
||||
endmodule
|
||||
|
||||
module Test7(input [2:0] state, output reg Z11);
|
||||
always @(*) begin
|
||||
casez (state)
|
||||
3'b000: Z11 = 1'b0;
|
||||
3'b0?1: Z11 = 1'b1;
|
||||
default: Z11 = 1'bx;
|
||||
endcase
|
||||
end
|
||||
endmodule
|
||||
|
||||
// This is not implemented yet
|
||||
//module Test3(input OE, input A, inout Z3);
|
||||
// always @(*) begin
|
||||
// if(OE) begin
|
||||
// Z3 = A;
|
||||
// end else begin
|
||||
// Z3 = 1'bz;
|
||||
// end
|
||||
// end
|
||||
//endmodule
|
||||
|
||||
Reference in New Issue
Block a user