如何在always块中与其他语句同时执行任务?

时间:2015-12-03 13:26:53

标签: verilog xilinx-ise

我正在Verilog中编写8 * 4 RAM的代码。对于每个存储器的二进制单元,我使用的是SR触发器。最初,每个单元被分配1'bx。逻辑似乎是正确的,但输出不是。这可能是因为语句没有同时执行。任何人都可以建议我如何让SRFlipFlop任务与其他语句同时执行?

module memory(addr, read_data, rw, write_data, clk);
// read_data is the data read
// rw specifies read or write operation. 1 for read and 0 for write
// write data is the data to be written
// addr is the address to be written or read    

task SRFlipFlop;
input d,r,s,clk; // d is the value initially stored
output q;  
begin
case({s,r})
{1'b0,1'b0}: q<=d;
{1'b0,1'b1}: q<=1'b0;
{1'b1,1'b0}: q<=1'b1;
{1'b1,1'b1}: q<=1'bx;
endcase
end
endtask

task decoder;     // a 3 to 8 line decoder
input [2:0] A;
input E;
output [7:0] D;
if (!E)
    D <= 16'b0000000000000000;
else
    begin
        case (A)
            3'b000 : D <= 8'b00000001;
            3'b001 : D <= 8'b00000010;
            3'b010 : D <= 8'b00000100;
            3'b011 : D <= 8'b00001000;
            3'b100 : D <= 8'b00010000;
            3'b101 : D <= 8'b00100000;
            3'b110 : D <= 8'b01000000;
            3'b111 : D <= 8'b10000000;
        endcase
    end
endtask


output reg [3:0] read_data;
input [3:0] write_data;
input [2:0] addr;
input rw, clk;
reg [3:0] memory [7:0];
reg [3:0] r [7:0];
reg [3:0] s [7:0];
reg [3:0] intermediate;
reg [3:0] select [7:0];
reg [7:0] out;
reg [7:0] out1;
integer i,j,k,l;
initial 
  begin
    for (i = 0; i <= 7; i=i+1) 
        begin
            for (j = 0; j <= 3; j=j+1) 
                begin
                 memory[i][j] = 1'bx;
                 r[i][j] = 1'b0;
                 s[i][j] = 1'b0;
                 select[i][j] = 1'b0;
                end
        end
  end
  always @(posedge clk)
  begin
    decoder(addr, 1'b1, out);
     for (i = 0; i <= 7; i=i+1)
        begin
            if (out[i] == 1'b1)
                begin
                for (j = 0; j <= 3; j=j+1)
                    begin
                        select[i][j] <= 1'b1;
                        s[i][j] <= write_data[j] & !rw & select[i][j];
                        r[i][j] <= !write_data[j] & !rw & select[i][j];
                        SRFlipFlop(memory[i][j],r[i][j],s[i][j],clk,intermediate);
                        memory[i][j] <= intermediate;
                        read_data[j] <= memory[i][j];
                    end
                end
        end
  end
endmodule

1 个答案:

答案 0 :(得分:0)

您的代码风格非常以软件为导向。就个人而言,我想知道我的代码看起来像一个电路,所以我不会使用嵌套的for循环和任务,而是使用模块和生成循环来创建我的电路。

我无法使你的代码工作,但我怀疑错误是因为s和r在每次迭代时都没有重置为零。

我在这里创建了一个功能设计: http://www.edaplayground.com/x/Guc

我没有使用初始块来初始化值,而是添加了异步重置。

SRFF任务已转换为模块。 RAMblock模块实例化四个SRFF模块。 8个RAM块在内存模块中实例化。

我已将压缩的(reg [] a [])数组转换为解压缩的数组(reg [][] a),以便能够在没有for循环的情况下对多个位执行按位运算。

如果您对代码有疑问,请随时给我发消息。

编辑:在这个设计中最重要的一点是我将顺序电路与组合分开。通过这种方式,可以更容易地控制应该在clk的构造上更新的内容以及应该对在posedge中执行的更改的组合反应。