| /* |
| IOBUF |
| Not a primitive? |
| Looks like it has an OBUFT |
| |
| |
| Output buffer family: |
| OBUF |
| OBUFDS |
| OBUFT |
| OBUFTDS |
| */ |
| |
| `ifndef ROI |
| ERROR: must set ROI |
| `endif |
| |
| module top(input clk, stb, di, output do); |
| localparam integer DIN_N = 256; |
| localparam integer DOUT_N = 256; |
| |
| reg [DIN_N-1:0] din; |
| wire [DOUT_N-1:0] dout; |
| |
| reg [DIN_N-1:0] din_shr; |
| reg [DOUT_N-1:0] dout_shr; |
| |
| always @(posedge clk) begin |
| din_shr <= {din_shr, di}; |
| dout_shr <= {dout_shr, din_shr[DIN_N-1]}; |
| if (stb) begin |
| din <= din_shr; |
| dout_shr <= dout; |
| end |
| end |
| |
| assign do = dout_shr[DOUT_N-1]; |
| |
| `ROI |
| roi ( |
| .clk(clk), |
| .din(din), |
| .dout(dout) |
| ); |
| endmodule |
| |
| module roi_io_a(input clk, input [255:0] din, output [255:0] dout); |
| assign dout[0] = din[0] & din[1]; |
| |
| IOBUF_INTERMDISABLE #( |
| .DRIVE(12), |
| .IBUF_LOW_PWR("TRUE"), |
| .IOSTANDARD("DEFAULT"), |
| .SLEW("SLOW"), |
| .USE_IBUFDISABLE("TRUE") |
| ) IOBUF_INTERMDISABLE_inst ( |
| .O(1'b0), |
| .IO(1'bz), |
| .I(dout[8]), |
| .IBUFDISABLE(1'b0), |
| .INTERMDISABLE(1'b0), |
| .T(1'b1)); |
| |
| endmodule |
| |
| module roi_io_b(input clk, input [255:0] din, output [255:0] dout); |
| assign dout[0] = din[0] & din[1]; |
| |
| wire onet; |
| |
| IOBUF_INTERMDISABLE #( |
| .DRIVE(12), |
| .IBUF_LOW_PWR("FALSE"), |
| .IOSTANDARD("DEFAULT"), |
| .SLEW("SLOW"), |
| .USE_IBUFDISABLE("FALSE") |
| ) IOBUF_INTERMDISABLE_inst ( |
| .O(onet), |
| .IO(1'bz), |
| .I(dout[8]), |
| .IBUFDISABLE(1'b0), |
| .INTERMDISABLE(1'b0), |
| .T(1'b1)); |
| |
| PULLUP PULLUP_inst ( |
| .O(onet) |
| ); |
| |
| IOBUF_INTERMDISABLE #( |
| .DRIVE(12), |
| .IBUF_LOW_PWR("FALSE"), |
| .IOSTANDARD("DEFAULT"), |
| .SLEW("SLOW"), |
| .USE_IBUFDISABLE("FALSE") |
| ) i2 ( |
| .O(), |
| .IO(1'bz), |
| .I(dout[8]), |
| .IBUFDISABLE(1'b0), |
| .INTERMDISABLE(1'b0), |
| .T(1'b1)); |
| |
| endmodule |
| |
| /* |
| For some reason this doesn't diff |
| Was this optimized out? |
| |
| ERROR: [Place 30-69] Instance roi/dut/OBUFT (OBUFT) is unplaced after IO placer |
| ERROR: [Place 30-68] Instance roi/dut/OBUFT (OBUFT) is not placed |
| */ |
| |
| /* |
| module roi_prop_a(input clk, input [255:0] din, output [255:0] dout); |
| assign dout[0] = din[0] & din[1]; |
| |
| //(* LOC="D19", KEEP, DONT_TOUCH *) |
| (* KEEP, DONT_TOUCH *) |
| IOBUF #( |
| .DRIVE(8), |
| .IBUF_LOW_PWR("TRUE"), |
| .IOSTANDARD("DEFAULT"), |
| .SLEW("SLOW") |
| ) dut ( |
| .O(dout[1]), |
| .I(din[0]), |
| .T(din[1])); |
| endmodule |
| |
| module roi_prop_b(input clk, input [255:0] din, output [255:0] dout); |
| assign dout[0] = din[0] & din[1]; |
| |
| //(* LOC="D19", KEEP, DONT_TOUCH *) |
| (* KEEP, DONT_TOUCH *) |
| IOBUF #( |
| .DRIVE(12), |
| .IBUF_LOW_PWR("TRUE"), |
| .IOSTANDARD("DEFAULT"), |
| .SLEW("SLOW") |
| ) dut ( |
| .O(dout[1]), |
| .I(din[0]), |
| .T(din[1])); |
| endmodule |
| */ |
| |
| /* |
| ERROR: [DRC REQP-1581] obuf_loaded: OBUFT roi/dut pin O drives one or more invalid loads. The loads are: dout_shr[1]_i_1 |
| ERROR: [Place 30-69] Instance roi/dut (OBUFT) is unplaced after IO placer |
| hmm |
| Abandoning verilog approach |
| tcl seems to work well, just use it directly |
| */ |
| module roi_prop_a(input clk, input [255:0] din, output [255:0] dout); |
| (* LOC="D19", KEEP, DONT_TOUCH *) |
| //(* KEEP, DONT_TOUCH *) |
| OBUFT #( |
| .DRIVE(8), |
| .IOSTANDARD("DEFAULT"), |
| .SLEW("SLOW") |
| ) dut ( |
| //.O(dout[1]), |
| .O(), |
| .I(din[0]), |
| .T(din[1])); |
| endmodule |
| |
| module roi_prop_b(input clk, input [255:0] din, output [255:0] dout); |
| (* LOC="D19", KEEP, DONT_TOUCH *) |
| //(* KEEP, DONT_TOUCH *) |
| (* KEEP, DONT_TOUCH *) |
| OBUFT #( |
| .DRIVE(12), |
| .IOSTANDARD("DEFAULT"), |
| .SLEW("SLOW") |
| ) dut ( |
| //.O(dout[1]), |
| .O(), |
| .I(din[0]), |
| .T(din[1])); |
| endmodule |
| |
| |