Hi!
Gerade arbeite ich mich ein wenig in Verilog ein. Dazu habe ich ein
Modul geschrieben, welches eine x86 Adresse mit Adresse und Segment
berechnen soll. Dazu habe ich folgenden Code geschrieben:
1 | module AddressGenerator(inAddr,inSeg,outAddr,enable);
|
2 | input [15:0] inAddr;
|
3 | input [15:0] inSeg;
|
4 | output [19:0] outAddr;
|
5 | input enable;
|
6 | //result = (segment * 10h) + addr
|
7 | assign outAddr = (enable) ? ({inSeg,1'b0} + inAddr) : 20'bz;
|
8 |
|
9 | initial $monitor("Addr: %h, Seg: %h, Enable: %d, Out: %h",inAddr,inSeg,enable,outAddr);
|
10 |
|
11 | endmodule
|
Test für Modul:
1 | reg [15:0] inAddr;
|
2 | reg [15:0] inSeg;
|
3 | wire [19:0] outAddr;
|
4 | wire enable;
|
5 | assign enable = 1;
|
6 |
|
7 | AddressGenerator ag(inAddr,inSeg,outAddr,enable);
|
8 |
|
9 | initial begin
|
10 | inAddr = 16'h0;
|
11 | inSeg = 16'h0;
|
12 | #5
|
13 | inAddr = 16'hAB;
|
14 | #5 inSeg = 16'h230;
|
15 | end
|
Im zweiten Teil sollte das Ergebnis '0x23AB' sein ((0x230 * 0x10) + 0xAB
= 0x23AB). Leider zeigt mir ModelSim folgenden Output an:
# Addr: 0000, Seg: 0000, Enable: 1, Out: 00000
# Addr: 00ab, Seg: 0000, Enable: 1, Out: 000ab
# Addr: 00ab, Seg: 0230, Enable: 1, Out: 0050b
habt ihr eine Idee wo das Problem liegen kann?
Danke im Voraus!