-
Notifications
You must be signed in to change notification settings - Fork 6
Set up tdpram #119
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Set up tdpram #119
Changes from all commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| from lambdalib.lambdalib import Lambda | ||
|
|
||
|
|
||
| class Tdpram(Lambda): | ||
| def __init__(self): | ||
| name = 'la_tdpram' | ||
| super().__init__(name, __file__, extrasources=['rtl/la_tdpram_impl.v']) | ||
|
|
||
|
|
||
| if __name__ == "__main__": | ||
| d = Tdpram() | ||
| d.write_fileset(f"{d.name}.f", fileset="rtl") |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,85 @@ | ||
| /***************************************************************************** | ||
| * Function: | ||
| * Copyright: Lambda Project Authors. All rights Reserved. | ||
| * License: MIT (see LICENSE file in Lambda repository) | ||
| * | ||
| * Docs: | ||
| * | ||
| * This is a wrapper for selecting from a set of hardened memory macros. | ||
| * | ||
| * A synthesizable reference model is used when the PROP is DEFAULT. The | ||
| * synthesizable model does not implement the cfg and test interface and should | ||
| * only be used for basic testing and for synthesizing for FPGA devices. | ||
| * Advanced ASIC development should rely on complete functional models | ||
| * supplied on a per macro basis. | ||
| * | ||
| * Technology specific implementations of "la_tdpram" would generally include | ||
| * one or more hardcoded instantiations of RAM modules with a generate | ||
| * statement relying on the "PROP" to select between the list of modules | ||
| * at build time. | ||
| * | ||
| ****************************************************************************/ | ||
|
|
||
| module la_tdpram #( | ||
| parameter DW = 32, // Memory width | ||
| parameter AW = 10, // address width (derived) | ||
| parameter PROP = "DEFAULT", // pass through variable for hard macro | ||
| parameter CTRLW = 128, // width of asic ctrl interface | ||
| parameter TESTW = 128 // width of asic test interface | ||
| ) ( // A port | ||
| input clk_a, // write clock | ||
| input ce_a, // write chip-enable | ||
| input we_a, // write enable | ||
| input [DW-1:0] wmask_a, // write mask | ||
| input [AW-1:0] addr_a, // write address | ||
| input [DW-1:0] din_a, // write data in | ||
| output [DW-1:0] dout_a, // read data out | ||
| // B port | ||
| input clk_b, // write clock | ||
| input ce_b, // write chip-enable | ||
| input we_b, // write enable | ||
| input [DW-1:0] wmask_b, // write mask | ||
| input [AW-1:0] addr_b, // write address | ||
| input [DW-1:0] din_b, // write data in | ||
| output [DW-1:0] dout_b, // read data out | ||
| // Power signal | ||
| input vss, // ground signal | ||
| input vdd, // memory core array power | ||
| input vddio, // periphery/io power | ||
| // Generic interfaces | ||
| input [CTRLW-1:0] ctrl, // pass through ASIC control interface | ||
| input [TESTW-1:0] test // pass through ASIC test interface | ||
| ); | ||
|
|
||
| la_tdpram_impl #( | ||
| .DW (DW), | ||
| .AW (AW), | ||
| .PROP (PROP), | ||
| .CTRLW (CTRLW), | ||
| .TESTW (TESTW) | ||
| ) memory ( | ||
| .clk_a (clk_a), | ||
| .ce_a (ce_a), | ||
| .we_a (we_a), | ||
| .wmask_a (wmask_a), | ||
| .addr_a (addr_a), | ||
| .din_a (din_a), | ||
| .dout_a (dout_a), | ||
|
|
||
| .clk_b (clk_b), | ||
| .ce_b (ce_b), | ||
| .we_b (we_b), | ||
| .wmask_b (wmask_b), | ||
| .addr_b (addr_b), | ||
| .din_b (din_b), | ||
| .dout_b (dout_b), | ||
|
|
||
| .vss (vss), | ||
| .vdd (vdd), | ||
| .vddio (vddio), | ||
|
|
||
| .ctrl (ctrl), | ||
| .test (test) | ||
| ); | ||
|
|
||
| endmodule | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,93 @@ | ||
| /***************************************************************************** | ||
| * Function: True Dual Port RAM (Two write + read ports) | ||
| * Copyright: Lambda Project Authors. All rights Reserved. | ||
| * License: MIT (see LICENSE file in Lambda repository) | ||
| * | ||
| * Docs: | ||
| * | ||
| * This is a wrapper for selecting from a set of hardened memory macros. | ||
| * | ||
| * A synthesizable reference model is used when the PROP is DEFAULT. The | ||
| * synthesizable model does not implement the cfg and test interface and should | ||
| * only be used for basic testing and for synthesizing for FPGA devices. | ||
| * Advanced ASIC development should rely on complete functional models | ||
| * supplied on a per macro basis. | ||
| * | ||
| * Technology specific implementations of "la_tdpram" would generally include | ||
| * one or more hardcoded instantiations of RAM modules with a generate | ||
| * statement relying on the "PROP" to select between the list of modules | ||
| * at build time. | ||
| * | ||
| ****************************************************************************/ | ||
|
|
||
| module la_tdpram_impl #( | ||
| parameter DW = 32, // Memory width | ||
| parameter AW = 10, // address width (derived) | ||
| parameter PROP = "DEFAULT", // pass through variable for hard macro | ||
| parameter CTRLW = 128, // width of asic ctrl interface | ||
| parameter TESTW = 128 // width of asic test interface | ||
| ) ( // Write port | ||
| input clk_a, // write clock | ||
| input ce_a, // write chip-enable | ||
| input we_a, // write enable | ||
| input [DW-1:0] wmask_a, // write mask | ||
| input [AW-1:0] addr_a, // write address | ||
| input [DW-1:0] din_a, // write data in | ||
| output reg [DW-1:0] dout_a, // read data out | ||
| // B port | ||
| input clk_b, // write clock | ||
| input ce_b, // write chip-enable | ||
| input we_b, // write enable | ||
| input [DW-1:0] wmask_b, // write mask | ||
| input [AW-1:0] addr_b, // write address | ||
| input [DW-1:0] din_b, // write data in | ||
| output reg [DW-1:0] dout_b, // read data out | ||
| // Power signal | ||
| input vss, // ground signal | ||
| input vdd, // memory core array power | ||
| input vddio, // periphery/io power | ||
| // Generic interfaces | ||
| input [CTRLW-1:0] ctrl, // pass through ASIC control interface | ||
| input [TESTW-1:0] test // pass through ASIC test interface | ||
| ); | ||
|
|
||
| // Generic RTL RAM | ||
| /* verilator lint_off MULTIDRIVEN */ | ||
| reg [DW-1:0] ram[(2**AW)-1:0]; | ||
| /* verilator lint_on MULTIDRIVEN */ | ||
|
|
||
| integer i; | ||
|
|
||
| // Port A write | ||
| always @(posedge clk_a) begin | ||
| for (i = 0; i < DW; i = i + 1) begin | ||
| if (ce_a && we_a && wmask_a[i]) begin | ||
| ram[addr_a][i] <= din_a[i]; | ||
| end | ||
| end | ||
| end | ||
|
|
||
| // Port B write | ||
| always @(posedge clk_b) begin | ||
| for (i = 0; i < DW; i = i + 1) begin | ||
| if (ce_b && we_b && wmask_b[i]) begin | ||
| ram[addr_b][i] <= din_b[i]; | ||
| end | ||
| end | ||
| end | ||
|
|
||
| // Port A read | ||
| always @(posedge clk_a) begin | ||
| if (ce_a && ~we_a) begin | ||
| dout_a <= ram[addr_a]; | ||
| end | ||
| end | ||
|
|
||
| // Port B read | ||
| always @(posedge clk_b) begin | ||
| if (ce_b && ~we_b) begin | ||
| dout_b <= ram[addr_b]; | ||
| end | ||
| end | ||
|
|
||
| endmodule |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.