【问题标题】:Designing cpu but Value isn't moving in verilog设计 cpu 但价值没有在 verilog 中移动
【发布时间】:2026-02-14 23:30:01
【问题描述】:
module sram(addr,clk,din,dout,we); //sram.v

parameter addr_width = 12, word_depth = 110, word_width = 16;

input clk,we;
input [addr_width-1:0] addr; 
input [word_width-1:0] din; 
output [word_width-1:0] dout; 

reg [word_width-1:0]mem[0:word_depth-1]; 
reg [word_width-1:0]dout;

always @ (posedge clk) begin
    if(!we)
        mem[addr] <= din[word_width-1:0]; 
    end
always @ (posedge clk) begin
    if(we)
        dout[word_width-1:0] <= mem[addr];
    end

endmodule



module cpu(clk,reset); //cpu.v

input clk, reset;


reg [15:0] dr, ac, ir;
reg [11:0] addr, pc;

reg [2:0] opcode;
reg [5:0]t;
reg we;
reg sc;

reg [15:0] din;
wire [15:0] dout;

sram sram(addr,clk,din,dout,we);

always @ (posedge clk or negedge reset) begin
    if(!reset) begin
        ir <= 16'd0; dr <= 16'd0; ac <= 16'd0; addr <= 12'd0; pc <= 12'd0; sc <= 0; t <= 0; we<=1;
        end

        else if(t==0) begin
        addr <= pc; sc<=1; 
        end

        else if(t==1) begin
        ir[15:0] <= dout[addr]; pc <= pc+1; 

        end

        else if(t==2) begin
        opcode <= ir[14:12]; 
        addr <= ir[11:0]; //no indirect mode, no i
        sc<=0;

        end

        else if(t==3) begin
            if(opcode==3'b111) begin
                ac <= 0; 

                end
            if(opcode==3'b000) begin
            end
        end

   end

always @ (negedge clk) begin
    if(!sc) begin
    t<=0;
    end
    else t<=t+1;
    end

endmodule


module tbcpu(); //tbcpu.v

reg clk,reset;

integer file_pointer;

cpu cpu(clk,reset);

always #5 clk = ~clk;

initial begin
    $readmemb("memory.dat", tbcpu.cpu.sram.mem); //assembly

    clk = 0; reset = 1; 
    #1 reset = 0;
    #1 reset = 1;

    #100 $finish;

    end
endmodule

我正在设计 cpu 并且很难,因为 ir[15:0] 值不会改变并固定在 0000。

我期待 t 到 01 时(15ns), 这个条件句有效:

else if(t==1) 开始 ir[15:0]

所以dout[0] 值7800 进入ir[15:0],但它不起作用。我怎样才能解决这个问题?我也对 sc,t 时间感到困惑,所以我通过更改 negedge clk 中的 sc,t 值解决了这个问题。

【问题讨论】:

    标签: verilog cpu-registers register-transfer-level


    【解决方案1】:

    变化:

        ir[15:0] <= dout[addr]; 
    

    到:

        ir[15:0] <= dout; 
    

    dout[addr] 选择 16 位 dout 信号的单个位。您将dout 视为内存变量,而不是矢量信号。在 15ns 时,dout='h7800 和 addr=0,表示ir=dout[addr]=dout[0]=0。

    【讨论】: