forked from osecpu/fpga
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaddrdec.v
148 lines (141 loc) · 3.11 KB
/
addrdec.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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
`timescale 1ns / 1ps
`include "def.v"
module AddrDecoder(reqType, ofs, base, count, lbType, addr, invalid);
input [5:0] reqType;
input [15:0] ofs;
input [15:0] base;
input [15:0] count;
input [5:0] lbType;
output [15:0] addr;
output invalid;
//
assign addr = base + ofs;
assign invalid = !(
isValidLabelType(reqType) &&
reqType == lbType &&
ofs < count
);
function isValidLabelType(input [5:0] type);
case(reqType)
//`LBTYPE_UNDEFINED:;
`LBTYPE_VPTR: isValidLabelType = 1'd1;
`LBTYPE_SINT8: isValidLabelType = 1'd1;
`LBTYPE_UINT8: isValidLabelType = 1'd1;
`LBTYPE_SINT16: isValidLabelType = 1'd1;
`LBTYPE_UINT16: isValidLabelType = 1'd1;
`LBTYPE_SINT32: isValidLabelType = 1'd1;
`LBTYPE_UINT32: isValidLabelType = 1'd1;
`LBTYPE_SINT4: isValidLabelType = 1'd1;
`LBTYPE_UINT4: isValidLabelType = 1'd1;
`LBTYPE_SINT2: isValidLabelType = 1'd1;
`LBTYPE_UINT2: isValidLabelType = 1'd1;
`LBTYPE_SINT1: isValidLabelType = 1'd1;
`LBTYPE_UINT1: isValidLabelType = 1'd1;
`LBTYPE_CODE: isValidLabelType = 1'd1;
default: isValidLabelType = 1'd0;
endcase
endfunction
endmodule
module testbench_addrdec();
reg clk;
//
reg [5:0] reqType;
reg [15:0] ofs;
reg [15:0] base;
reg [15:0] count;
reg [5:0] lbType;
wire [15:0] addr;
wire invalid;
AddrDecoder addrdec(reqType, ofs, base, count, lbType, addr, invalid);
initial begin
$dumpfile("addrdec.vcd");
$dumpvars(0, testbench_addrdec);
// all invalid
reqType = `LBTYPE_UNDEFINED;
ofs = 4;
base = 16'hffff;
count = 0;
lbType = `LBTYPE_UNDEFINED;
//
#1;
$display ("addr: %X", addr);
$display ("invalid: %X", invalid);
if(invalid == 1) $display("PASS");
else begin
$display("FAILED");
$finish;
end
// valid
reqType = `LBTYPE_CODE;
ofs = 4;
base = 16'hff00;
count = 16'h00ff;
lbType = `LBTYPE_CODE;
//
#1;
$display ("addr: %X", addr);
$display ("invalid: %X", invalid);
if(invalid == 0 && addr == 16'hff04) $display("PASS");
else begin
$display("FAILED");
$finish;
end
// type not matched
reqType = `LBTYPE_VPTR;
ofs = 4;
base = 16'hff00;
count = 16'h00ff;
lbType = `LBTYPE_CODE;
//
#1;
$display ("addr: %X", addr);
$display ("invalid: %X", invalid);
if(invalid == 1) $display("PASS");
else begin
$display("FAILED");
$finish;
end
// out of limit
reqType = `LBTYPE_CODE;
ofs = 4;
base = 16'hff00;
count = 16'h004;
lbType = `LBTYPE_CODE;
//
#1;
$display ("addr: %X", addr);
$display ("invalid: %X", invalid);
if(invalid == 1) $display("PASS");
else begin
$display("FAILED");
$finish;
end
// last element in bound
reqType = `LBTYPE_CODE;
ofs = 3;
base = 16'hff00;
count = 16'h004;
lbType = `LBTYPE_CODE;
//
#1;
$display ("addr: %X", addr);
$display ("invalid: %X", invalid);
if(invalid == 0 && addr == 16'hff03) $display("PASS");
else begin
$display("FAILED");
$finish;
end
//
$display ("Simulation end");
$finish;
end
always begin
// クロックを生成する。
// #1; は、1クロック待機する。
clk <= 0; #1;
clk <= 1; #1;
end
always @ (posedge clk)
begin
end
endmodule