Improved PFPU timing + SW fixes
authorlekernel <sebastien.bourdeauducq@lekernel.net>
Mon, 15 Feb 2010 21:46:23 +0000 (22:46 +0100)
committerlekernel <sebastien.bourdeauducq@lekernel.net>
Mon, 15 Feb 2010 21:46:23 +0000 (22:46 +0100)
cores/pfpu/rtl/pfpu_dma.v
cores/pfpu/test/complete/tb_pfpu.v
software/demo/apipe.c
software/demo/eval.c
software/demo/rpipe.c
software/demo/shell.c

index 9b85e3b..2b91922 100644 (file)
@@ -29,7 +29,7 @@ module pfpu_dma(
        output ack,
        output busy,
 
-       output [31:0] wbm_dat_o,
+       output reg [31:0] wbm_dat_o,
        output reg [31:0] wbm_adr_o,
        output wbm_cyc_o,
        output wbm_stb_o,
@@ -96,8 +96,14 @@ assign q_p = dma_en;
 assign q_c = wbm_ack_i & write_y;
 assign q_i = {dma_d1, dma_d2, y, x};
 
-always @(posedge sys_clk)
+always @(posedge sys_clk) begin
        wbm_adr_o <= {dma_base, 3'd0} + {q_o[13:0], write_y, 2'd0};
+       wbm_dat_o <= write_y ? q_o[45:14] : q_o[q_width-1:46];
+end
+
+reg bus_not_valid_yet;
+always @(posedge sys_clk)
+       bus_not_valid_yet <= wbm_ack_i;
 
 always @(posedge sys_clk) begin
        if(sys_rst)
@@ -105,14 +111,8 @@ always @(posedge sys_clk) begin
        else if(wbm_ack_i) write_y <= ~write_y;
 end
 
-assign wbm_dat_o = write_y ? q_o[45:14] : q_o[q_width-1:46];
-
-reg address_not_valid_yet;
-always @(posedge sys_clk)
-       address_not_valid_yet <= q_c;
-
-assign wbm_cyc_o = ~empty & ~address_not_valid_yet;
-assign wbm_stb_o = ~empty & ~address_not_valid_yet;
+assign wbm_cyc_o = ~empty & ~bus_not_valid_yet;
+assign wbm_stb_o = ~empty & ~bus_not_valid_yet;
 
 assign ack = ~full;
 assign busy = ~empty;
index 87a69d8..9a082c2 100644 (file)
@@ -50,7 +50,7 @@ always @(posedge sys_clk) begin
                if(wbm_stb_o & ~wbm_ack_i & (($random % 200) == 0)) begin
                        wbm_ack_i <= 1'b1;
                        $fromfloat(wbm_dat_o, r);
-                       $display("DMA write addr %x:%x (%d;%d - %f - %d %d)", wbm_adr_o, wbm_dat_o, wbm_adr_o[8:2], wbm_adr_o[15:9], r, wbm_dat_o[31:16], wbm_dat_o[15:0]);
+                       $display("DMA write addr %x:%x (%b - %f)", wbm_adr_o, wbm_dat_o, wbm_adr_o[2], r);
                end
        end
 end
@@ -166,7 +166,7 @@ always begin
        csrwrite(32'h0814, 32'b0000000_0000011_0000100_0111_0000000); /* VECTOUT R3, R4 */
        
        /* DMA base */
-       csrwrite(32'h0004, 32'h12340000);
+       csrwrite(32'h0004, 32'h401de328);
        
        /* Start */
        csrwrite(32'h0000, 32'h00000001);
@@ -197,6 +197,9 @@ always begin
        csrwrite(32'h0820, 32'b0000000_0000000_0000000_0000_0000000); /* NOP */
        csrwrite(32'h0824, 32'b0000000_0000000_0000000_0000_0000101); /* NOP | EXIT R5 */
        csrwrite(32'h0828, 32'b0000000_0000101_0000101_0111_0000000); /* VECTOUT R5, R5 */
+
+       /* DMA base */
+       csrwrite(32'h0004, 32'h401de328);
        
        /* Start */
        csrwrite(32'h0000, 32'h00000001);
index 2396e85..eb28962 100644 (file)
@@ -112,7 +112,7 @@ void apipe_stop()
 
 static struct pfpu_td pfpu_td;
 
-//#define DUMP_MESH
+#define DUMP_MESH
 
 static void pvv_callback(struct pfpu_td *td)
 {
@@ -124,8 +124,8 @@ static void pvv_callback(struct pfpu_td *td)
        rpipe_frame = (struct rpipe_frame *)td->user;
 
        #ifdef DUMP_MESH
-       for(y=0;y<6;y++) {
-               for(x=0;x<6;x++)
+       for(y=10;y<13;y++) {
+               for(x=10;x<13;x++)
                        printf("(%02d %02d) ", rpipe_frame->vertices[y][x].y, rpipe_frame->vertices[y][x].x);
                printf("\n");
        }
index 38520c5..759afa3 100644 (file)
@@ -314,7 +314,7 @@ static int generate_pervertex(struct eval_state *sc, struct preset *ast)
        ADD_ISN(PFPU_OPCODE_FMUL,       FR( 21), BR(  6), FR( 23)); /* FR23: Y screen float */
        ADD_ISN(PFPU_OPCODE_F2I,        FR( 22), BR(  0), FR( 24)); /* FR26: X screen integer */
        ADD_ISN(PFPU_OPCODE_F2I,        FR( 23), BR(  0), FR( 25)); /* FR27: Y screen integer */
-       ADD_ISN(PFPU_OPCODE_VECTOUT,    FR( 25), FR( 24), BR(  0)); /* put out vector */
+       ADD_ISN(PFPU_OPCODE_VECTOUT,    FR( 24), FR( 25), BR(  0)); /* put out vector */
 
 #undef BR
 #undef FR
index 3774e0d..3215deb 100644 (file)
@@ -54,7 +54,7 @@ static unsigned short texbufferB[512*512];
 static unsigned short *tex_frontbuffer;
 static unsigned short *tex_backbuffer;
 
-static struct tmu_vertex scale_tex_vertices[TMU_MESH_MAXSIZE][TMU_MESH_MAXSIZE];
+static struct tmu_vertex scale_tex_vertices[TMU_MESH_MAXSIZE][TMU_MESH_MAXSIZE] __attribute__((aligned(8)));
 
 #define SPAM_W         75
 #define SPAM_H         75
@@ -62,7 +62,7 @@ static struct tmu_vertex scale_tex_vertices[TMU_MESH_MAXSIZE][TMU_MESH_MAXSIZE];
 #define SPAM_Y         30
 #define SPAM_CHROMAKEY 0x001f
 
-static struct tmu_vertex spam_vertices[TMU_MESH_MAXSIZE][TMU_MESH_MAXSIZE];
+static struct tmu_vertex spam_vertices[TMU_MESH_MAXSIZE][TMU_MESH_MAXSIZE] __attribute__((aligned(8)));
 
 void rpipe_init()
 {
@@ -116,7 +116,7 @@ static void rpipe_start(struct rpipe_frame *frame)
 {
        tmu_task1.flags = 0;
        tmu_task1.hmeshlast = renderer_hmeshlast;
-       tmu_task1.vmeshlast = renderer_hmeshlast;
+       tmu_task1.vmeshlast = renderer_vmeshlast;
        tmu_task1.brightness = frame->brightness;
        tmu_task1.chromakey = 0;
        tmu_task1.vertices = &frame->vertices[0][0];
@@ -274,7 +274,7 @@ static void rpipe_draw_waves()
                        break;
        }
 
-       wave_draw(tex_backbuffer, vga_hres, vga_vres, &params, vertices, nvertices);
+       wave_draw(tex_backbuffer, renderer_texsize, renderer_texsize, &params, vertices, nvertices);
 }
 
 static void rpipe_tmu_copydone(struct tmu_td *td)
index e504c5a..8b2627a 100644 (file)
@@ -241,9 +241,9 @@ static void checker()
  * This test should only be run when the driver task queue
  * is empty.
  */
+static struct tmu_vertex mesh[128][128] __attribute__((aligned(8)));
 static void pfputest()
 {
-       unsigned int mesh[128][128];
        unsigned int *pfpu_regs = (unsigned int *)CSR_PFPU_DREGBASE;
        unsigned int *pfpu_code = (unsigned int *)CSR_PFPU_CODEBASE;
        int x, y;
@@ -255,10 +255,12 @@ static void pfputest()
        irq_setmask(oldmask & (~IRQ_PFPU));
 
        for(y=0;y<128;y++)
-               for(x=0;x<128;x++)
-                       mesh[y][x] = 0xdeadbeef;
+               for(x=0;x<128;x++) {
+                       mesh[y][x].x = 0xdeadbeef;
+                       mesh[y][x].y = 0xdeadbeef;
+               }
 
-       CSR_PFPU_MESHBASE = (unsigned int)mesh;
+       CSR_PFPU_MESHBASE = (unsigned int)&mesh;
        //CSR_PFPU_HMESHLAST = 6;
        //CSR_PFPU_VMESHLAST = 9;
 
@@ -277,7 +279,8 @@ static void pfputest()
        pfpu_code[ 6] = 0x00000000;
        pfpu_code[ 7] = 0x00000000;
        pfpu_code[ 8] = 0x00000000;
-       pfpu_code[ 9] = 0x0000007f;
+       pfpu_code[ 9] = 0x00000005;
+       pfpu_code[10] = 0x00142b80;
 
        /*printf("Program:\n");
        for(x=0;x<10;x++)
@@ -304,12 +307,18 @@ static void pfputest()
        printf("Result:\n");
        for(y=0;y<10;y++) {
                for(x=0;x<12;x++)
-                       printf("%08x ", mesh[y][x]);
+                       printf("%08x ", mesh[y][x].x);
+               printf("\n");
+       }
+       printf("\n");
+       for(y=0;y<10;y++) {
+               for(x=0;x<12;x++)
+                       printf("%08x ", mesh[y][x].y);
                printf("\n");
        }
 
        printf("Program:\n");
-       for(x=0;x<10;x++)
+       for(x=0;x<11;x++)
                printf("%08x ", pfpu_code[x]);
        printf("\n");