From ddb682e910c60cda1f7bea097020bb5b1e862cba Mon Sep 17 00:00:00 2001 From: Fang Lu <cc2lufang@gmail.com> Date: Tue, 12 Dec 2017 01:06:29 -0600 Subject: [PATCH] gl - fix unsafe behaviors - Prevent writing to out-of-screen locations - Fix RC enable sync --- gl/gl_mgr.sv | 7 +++++-- gl/painters/gl_painter_circle.sv | 4 +--- gl/painters/gl_painter_image.sv | 3 +-- gl/painters/gl_painter_polygon.sv | 5 ++--- gl/painters/gl_painter_rect.sv | 4 ++-- gl/painters/gl_painter_ring.sv | 5 ++--- 6 files changed, 13 insertions(+), 15 deletions(-) diff --git a/gl/gl_mgr.sv b/gl/gl_mgr.sv index 6dbc9d0..73f6eaa 100644 --- a/gl/gl_mgr.sv +++ b/gl/gl_mgr.sv @@ -106,8 +106,11 @@ module gl_mgr ( // Paint Write logic fb_PAINT_REQ; logic [9:0] fb_PAINT_X, fb_PAINT_Y; + logic [9:0] fb_PAINT_X_san, fb_PAINT_Y_san; logic [15:0] fb_PAINT_RGB16; logic fb_PAINT_READY; + assign fb_PAINT_X_san = (fb_PAINT_X>10'd639) ? 10'd639 : fb_PAINT_X; + assign fb_PAINT_Y_san = (fb_PAINT_Y>10'd479) ? 10'd479 : fb_PAINT_Y; gl_frame_buffer frame_buffer( .CLK (CLOCK), .RESET (RESET), @@ -122,8 +125,8 @@ module gl_mgr ( .GL_DATA (fb_GL_RGB), .GL_READY (fb_GL_READY), .PAINT_REQ (fb_PAINT_REQ), - .PAINT_X (fb_PAINT_X), - .PAINT_Y (fb_PAINT_Y), + .PAINT_X (fb_PAINT_X_san), + .PAINT_Y (fb_PAINT_Y_san), .PAINT_RGB16 (fb_PAINT_RGB16), .PAINT_READY (fb_PAINT_READY), .BUF_ACTIVE (paint_buffer), diff --git a/gl/painters/gl_painter_circle.sv b/gl/painters/gl_painter_circle.sv index 408c37c..214025c 100644 --- a/gl/painters/gl_painter_circle.sv +++ b/gl/painters/gl_painter_circle.sv @@ -37,6 +37,7 @@ module gl_painter_circle ( assign fb_PAINT_RGB16 = color; assign RC_ADDR = {fb_PAINT_X, fb_PAINT_Y[8:0], PAINT_BUFFER}; assign RC_DATA_WR = 1'b1; + assign RC_WE = fb_PAINT_REQ; always_ff @(posedge CLOCK) begin if(RESET | ~EN) begin @@ -72,7 +73,6 @@ module gl_painter_circle ( xlen_in = xlen; color_in = color; DONE = 1'b0; - RC_WE = 1'b0; paint_req_in = 1'b0; case (state) @@ -88,7 +88,6 @@ module gl_painter_circle ( s_axis: begin paint_req_in = 1'b1; - RC_WE = 1'b1; if(fb_PAINT_READY) begin // Value written, move to next pixel x_in = x + 1; @@ -127,7 +126,6 @@ module gl_painter_circle ( s_paint: begin paint_req_in = 1'b1; - RC_WE = 1'b1; if(fb_PAINT_READY) begin // Value written, move to next pixel x_in = x + 1; diff --git a/gl/painters/gl_painter_image.sv b/gl/painters/gl_painter_image.sv index 61a5852..a7d53d2 100644 --- a/gl/painters/gl_painter_image.sv +++ b/gl/painters/gl_painter_image.sv @@ -50,6 +50,7 @@ module gl_painter_image ( assign RC_ADDR = {fb_PAINT_X, fb_PAINT_Y[8:0], PAINT_BUFFER}; assign RC_DATA_WR = 1'b1; + assign RC_WE = fb_PAINT_REQ; assign fb_GL_ADDR = img_ptr; @@ -84,7 +85,6 @@ module gl_painter_image ( color_in = color; i_in = i; DONE = 1'b0; - RC_WE = 1'b0; paint_req_in = 1'b0; read_req_in = 1'b0; img_ptr_in = img_ptr; @@ -132,7 +132,6 @@ module gl_painter_image ( s_paint: begin paint_req_in = 1'b1; - RC_WE = 1'b1; if(fb_PAINT_READY) begin // Value written, move to next location i_in = i + 1; diff --git a/gl/painters/gl_painter_polygon.sv b/gl/painters/gl_painter_polygon.sv index 9647b64..a9b50a1 100644 --- a/gl/painters/gl_painter_polygon.sv +++ b/gl/painters/gl_painter_polygon.sv @@ -35,8 +35,10 @@ module gl_painter_polygon ( assign fb_PAINT_RGB16 = C0; assign fb_PAINT_X = x; assign fb_PAINT_Y = y; + assign RC_ADDR = {fb_PAINT_X, fb_PAINT_Y[8:0], PAINT_BUFFER}; assign RC_DATA_WR = 1'b1; + assign RC_WE = fb_PAINT_REQ; // Inclined line scanner instances logic [9:0] l_x1, l_y1, l_x2, l_y2, r_x1, r_y1, r_x2, r_y2; @@ -81,7 +83,6 @@ module gl_painter_polygon ( y_in = y; xbeg_in = xbeg; DONE = 1'b0; - RC_WE = 1'b0; paint_req_in = 1'b0; l_lim_in = l_lim; r_lim_in = r_lim; @@ -96,7 +97,6 @@ module gl_painter_polygon ( s_scan_left: begin paint_req_in = 1'b1; - RC_WE = 1'b1; if(fb_PAINT_READY) begin // Value written, move to next pixel x_in = x - 1; @@ -111,7 +111,6 @@ module gl_painter_polygon ( s_scan_right: begin paint_req_in = 1'b1; - RC_WE = 1'b1; if(fb_PAINT_READY) begin // Value written, move to next pixel x_in = x + 1; diff --git a/gl/painters/gl_painter_rect.sv b/gl/painters/gl_painter_rect.sv index 6f0288b..d545eb4 100644 --- a/gl/painters/gl_painter_rect.sv +++ b/gl/painters/gl_painter_rect.sv @@ -36,8 +36,10 @@ module gl_painter_rect ( assign fb_PAINT_X = x; assign fb_PAINT_Y = y; assign fb_PAINT_RGB16 = color; + assign RC_ADDR = {x, y[8:0], PAINT_BUFFER}; assign RC_DATA_WR = 1'b1; + assign RC_WE = fb_PAINT_REQ; always_ff @(posedge CLOCK) begin if(RESET | ~EN) begin @@ -63,7 +65,6 @@ module gl_painter_rect ( y_in = y; color_in = color; DONE = 1'b0; - RC_WE = 1'b0; paint_req_in = 1'b0; case (state) @@ -76,7 +77,6 @@ module gl_painter_rect ( end s_paint: begin paint_req_in = 1'b1; - RC_WE = 1'b1; if(fb_PAINT_READY) begin // Value written, move to next pixel y_in = y + 1; diff --git a/gl/painters/gl_painter_ring.sv b/gl/painters/gl_painter_ring.sv index bccb30d..10c586e 100644 --- a/gl/painters/gl_painter_ring.sv +++ b/gl/painters/gl_painter_ring.sv @@ -33,8 +33,10 @@ module gl_painter_ring ( logic[2:0] quadrant, quadrant_in; assign fb_PAINT_RGB16 = CSTROKE; + assign RC_ADDR = {fb_PAINT_X, fb_PAINT_Y[8:0], PAINT_BUFFER}; assign RC_DATA_WR = 1'b1; + assign RC_WE = fb_PAINT_REQ; always_ff @(posedge CLOCK) begin if(RESET | ~EN) begin @@ -67,7 +69,6 @@ module gl_painter_ring ( y_in = y; xlen_in = xlen; DONE = 1'b0; - RC_WE = 1'b0; paint_req_in = 1'b0; case (state) @@ -82,7 +83,6 @@ module gl_painter_ring ( s_axis: begin paint_req_in = 1'b1; - RC_WE = 1'b1; if(fb_PAINT_READY) begin // Value written, move to next pixel x_in = x + 1; @@ -117,7 +117,6 @@ module gl_painter_ring ( s_paint: begin paint_req_in = 1'b1; - RC_WE = 1'b1; if(fb_PAINT_READY) begin // Value written, move to next pixel x_in = x + 1; -- GitLab