Xilinx MicroBlaze GAS Version 2.9.4 cmbasm.s page 1
1 /*
2 Custom Micro Blaze test asm
3 */
4 .globl _start
5 .section .text
6 .align 2
7 _start:
8 0000 B0001234 addik r3,r0,0x12345678 # 32ビット即値を r3 に設定
8 30605678
9 0008 30800100 addik r4,r0,0x100 # アドレス0x100を、 r4 に設定
10 000c F8640000 swi r3,r4,0 # r4 のアドレスに、r3 を書く
11 0010 E8A40000 lwi r5,r4,0 # r4 のアドレスから32ビットデータを r5 に読む
12 0014 30A50007 addik r5,r5,7 # r5 に 7 を加算する 0x1234567f になる
13 0018 F8A40000 swi r5,r4,0 # r5 を、r4 のアドレスに書く
14 001c E8C40004 lwi r6,r4,4 # r4 + 4 のアドレスから32ビットを r6 に読む。0x0
15 0020 E8C40000 lwi r6,r4,0 # r4 のアドレスから32ビットを r6 に読む 0x1234567f
16 0024 30C60001 loop: addik r6,r6,1 # r6 に1を加算
17 0028 B810FFFC brid loop # 繰り返し
18 002c 30E70001 addik r7,r7,1 # r7 に1を加算
19 .func
20 .end
21
Xilinx MicroBlaze GAS Version 2.9.4 cmbasm.s page 2
DEFINED SYMBOLS
cmbasm.s:7 .text:00000000 _start
cmbasm.s:16 .text:00000024 loop
NO UNDEFINED SYMBOLS
|
このリストから、同じ命令でも、最初の addik のようにコードの長いものがあり、32ビット即値のための、IMM 命令が自動的に追加されています。アセンブラレベルでは記述が同じでも、出来上がったバイナリコードでは、IMM 命令が追加されたことになっています。ここで、よく観察すると、IMM 命令は、ブランチ命令、brid と、よく似ていて、MSB4ビットが同じ、0xB となっています。内部の動作でも2命令を不可分に実行するシーケンスとなります。ブランチ命令 brid では、loop に戻るけれども、その次の命令、addik r7,r7,1 も実行してしまいます。こういうのを、遅延分岐と呼ぶらしいですが、ルネサスのSHシリーズマイコンでも同じですね。内部のパイプラインに取り込まれた命令を捨てずに実行して、効率をあげる手法です。
module mainmem( addr,wdata,rdata,clk,we
);
input [15:2] addr;
input [31:0] wdata;
output [31:0] rdata;
input clk;
input [3:0] we;
wire [3:0] dop;
RAMB16_S9 ram0(.DO(rdata[31:24]), .DOP(dop[3]), .ADDR(addr[12:2]), .CLK(clk), .DI(wdata[31:24]),
.DIP(1'b0),. EN(1'b1), .SSR(1'b0), .WE(we[3]));
RAMB16_S9 ram1(.DO(rdata[23:16]), .DOP(dop[2]), .ADDR(addr[12:2]), .CLK(clk), .DI(wdata[23:16]),
.DIP(1'b0),. EN(1'b1), .SSR(1'b0), .WE(we[2]));
RAMB16_S9 ram2(.DO(rdata[15:8]), .DOP(dop[1]), .ADDR(addr[12:2]), .CLK(clk), .DI(wdata[15:8]),
.DIP(1'b0),. EN(1'b1), .SSR(1'b0), .WE(we[1]));
RAMB16_S9 ram3(.DO(rdata[7:0]), .DOP(dop[0]), .ADDR(addr[12:2]), .CLK(clk), .DI(wdata[7:0]),
.DIP(1'b0),. EN(1'b1), .SSR(1'b0), .WE(we[0]));
defparam ram0.INIT_00=256'h000000000000000000000000000000000000000030B830E8E8F830E8F83030B0;
defparam ram1.INIT_00=256'h0000000000000000000000000000000000000000E710C6C4C4A4A5A464806000;
defparam ram2.INIT_00=256'h000000000000000000000000000000000000000000FF00000000000000015612;
defparam ram3.INIT_00=256'h000000000000000000000000000000000000000001FC01000400070000007834;
endmodule
|