0
0
Verilogprogramming~20 mins

Dual-port RAM design in Verilog - Practice Problems & Coding Challenges

Choose your learning style9 modes available
Challenge - 5 Problems
🎖️
Dual-Port RAM Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
Predict Output
intermediate
2:00remaining
Output of Dual-Port RAM Write and Read
What is the output of the following Verilog testbench snippet that writes and reads from a dual-port RAM?
Verilog
module dual_port_ram(
  input wire clk,
  input wire we_a, we_b,
  input wire [3:0] addr_a, addr_b,
  input wire [7:0] din_a, din_b,
  output reg [7:0] dout_a, dout_b
);
  reg [7:0] ram [0:15];

  always @(posedge clk) begin
    if (we_a) ram[addr_a] <= din_a;
    dout_a <= ram[addr_a];
  end

  always @(posedge clk) begin
    if (we_b) ram[addr_b] <= din_b;
    dout_b <= ram[addr_b];
  end
endmodule

module testbench;
  reg clk = 0;
  reg we_a, we_b;
  reg [3:0] addr_a, addr_b;
  reg [7:0] din_a, din_b;
  wire [7:0] dout_a, dout_b;

  dual_port_ram ram_inst(clk, we_a, we_b, addr_a, addr_b, din_a, din_b, dout_a, dout_b);

  always #5 clk = ~clk;

  initial begin
    we_a = 1; addr_a = 4'd3; din_a = 8'hAA;
    we_b = 1; addr_b = 4'd3; din_b = 8'h55;
    #10;
    we_a = 0; we_b = 0;
    #10;
    $display("dout_a = %h, dout_b = %h", dout_a, dout_b);
    $finish;
  end
endmodule
Adout_a = 55, dout_b = 55
Bdout_a = AA, dout_b = AA
Cdout_a = AA, dout_b = 55
Ddout_a = 55, dout_b = AA
Attempts:
2 left
💡 Hint
Remember that both ports write to the same address on the same clock edge. The order of writes affects the final stored value.
🧠 Conceptual
intermediate
1:30remaining
Understanding Dual-Port RAM Read Behavior
In a synchronous dual-port RAM, if both ports read from the same address simultaneously without any write enable active, what will be the output on both ports?
ABoth ports output zero regardless of stored data.
BBoth ports output the data from the other port's address.
CBoth ports output the stored data at that address.
DOne port outputs data, the other outputs undefined value.
Attempts:
2 left
💡 Hint
Think about how synchronous RAM reads work when no writes occur.
🔧 Debug
advanced
2:00remaining
Identify the Bug in Dual-Port RAM Write Logic
What is the main problem in this dual-port RAM write logic snippet? always @(posedge clk) begin if (we_a) ram[addr_a] <= din_a; else if (we_b) ram[addr_b] <= din_b; end
AThe clock edge sensitivity is incorrect.
BBoth ports write simultaneously causing data corruption.
CThe RAM array is not declared properly.
DPort B's write will never happen if Port A's write enable is true.
Attempts:
2 left
💡 Hint
Check how the if-else structure affects port B's write enable.
📝 Syntax
advanced
1:30remaining
Syntax Error in Dual-Port RAM Declaration
Which option contains the correct syntax to declare a 16x8-bit dual-port RAM array in Verilog?
Areg ram [7:0] [0:15];
Breg [7:0] ram [0:15];
Creg [0:15] ram [7:0];
Dreg [7:0] ram [15:0];
Attempts:
2 left
💡 Hint
Remember the order: data width first, then address range.
🚀 Application
expert
3:00remaining
Number of Unique Data Values Stored After Writes
Given a dual-port RAM with 16 addresses, initially all zero, the following writes occur simultaneously on the same clock edge: - Port A writes 8'h1A to address 5 - Port B writes 8'h2B to address 7 - Port A writes 8'h3C to address 7 - Port B writes 8'h4D to address 5 Assuming the write order in code is Port A then Port B for each port's write, how many unique data values are stored in the RAM after this clock edge?
A2
B4
C1
D3
Attempts:
2 left
💡 Hint
Consider that writes to the same address overwrite each other in order.